Submission #1215054

#TimeUsernameProblemLanguageResultExecution timeMemory
1215054dyj133446OGLEDALA (COI15_ogledala)C++20
0 / 100
1 ms576 KiB
#include<bits/stdc++.h>
using namespace std;
const int N=505;
int n,m,k,c[N],cnt[N],u[N],v[N],w[N],p[N],p1[N],p2[N];
bool flag[N],vis[N];
vector<int>v1[N];
vector<pair<int,int>>e[N];
int getfa(int x)
{
	if(p[x]==x)return x;
	return p[x]=getfa(p[x]);
}
void add(int x)
{
	e[u[x]].emplace_back(v[x],x),e[v[x]].emplace_back(u[x],x);
	cnt[w[x]]++,flag[x]=1;
}
void Erase(int x,pair<int,int>y)
{
	auto it=e[x].begin();
	while(it!=e[x].end())
	{
		if((*it)==y)return e[x].erase(it),void();
		it++;
	}
}
void del(int x)
{
	cnt[w[x]]--,flag[x]=0;
	Erase(u[x],make_pair(v[x],x));
	Erase(v[x],make_pair(u[x],x));
}
void dfs(int x,int prt)
{
	p1[x]=prt;
	for(auto y:e[x])if(y.first!=prt)p2[y.first]=y.second,dfs(y.first,x);
}
vector<int>Get(int x,int y)
{
	dfs(x,0);
	vector<int>res;
	while(y!=x)res.emplace_back(p2[y]),y=p1[y];
	return res;
}
bool solve(int x)
{
	vis[x]=1;
	for(auto y:v1[x])if(!flag[y])
	{
		int fx=getfa(u[y]),fy=getfa(v[y]);
		if(fx!=fy)
		{
			p[fy]=fx,add(y);
			return true;
		}
		vector<int>t=Get(u[y],v[y]);
		for(auto i:t)if(!vis[w[i]])
		{
			del(i),add(y);
			if(solve(w[i]))return true;
			add(i),del(y);
		}
	}
	return false;
}
int main()
{
	ios::sync_with_stdio(false);
	cin.tie(0),cout.tie(0);
	cin>>n>>m>>k;
	for(int i=1;i<=k;i++)cin>>c[i];
	for(int i=1;i<=m;i++)
	{
		cin>>u[i]>>v[i]>>w[i];
		v1[w[i]].emplace_back(i);
	}
	for(int i=1;i<=n;i++)p[i]=i;
	for(int i=1;i<=k;i++)
	{
		while(cnt[i]<c[i])
		{
			memset(vis,0,sizeof(vis));
			if(!solve(i))break;
		}
	}
	int ans=0;
	for(int i=1;i<=k;i++)ans+=cnt[i];
	cout<<m-ans<<'\n';
	for(int i=1;i<=m;i++)if(!flag[i])cout<<i<<' ';
	return 0;
}
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...