#1#2#5AC,剩下全部T飞掉,怎么优化
查看原帖
#1#2#5AC,剩下全部T飞掉,怎么优化
658620
Youth_Glory楼主2024/7/18 14:39
#include<bits/stdc++.h>
using namespace std;
typedef long long ll;
#define IOS ios::sync_with_stdio(false);cin.tie(0);cout.tie(0);

const ll N=2e5;
ll n,m,k,edge[2*N][3],fa[2*N],cnt;
bool vis[2*N];
stack<ll>record;
stack<ll>answer;

ll find(ll x){return fa[x]==x?x:fa[x]=find(fa[x]);}

signed main()
{
	IOS;
	cin>>n>>m;
	for(ll i=1,u,v;i<=m;i++){
		cin>>u>>v;
		edge[i][1]=u;
		edge[i][2]=v;
	}
	cin>>k;
	for(ll i=1,s;i<=k;i++){
		cin>>s;
		record.push(s);
		vis[s]=true;
	}
	cnt=n-k;
	for(ll i=1;i<=n;i++)fa[i]=i;
	while(!record.empty()){
		for(ll i=1,u,v;i<=m;i++){
			u=edge[i][1];
			v=edge[i][2];
			if((edge[i][0]==1)||vis[u]||vis[v]||(u=find(u))==(v=find(v)))continue;
			fa[find(u)]=find(v);
			edge[i][0]=1;
			--cnt;
		}
		answer.push(cnt);
		vis[record.top()]=false;
		++cnt;
		record.pop();
	}
	for(ll i=1,u,v;i<=m;i++){
		u=edge[i][1];
		v=edge[i][2];
		if(edge[i][0]||vis[u]||vis[v]||(u=find(u))==(v=find(v)))continue;
		fa[find(u)]=find(v);
		edge[i][0]=1;
		--cnt;
	}
	cout<<cnt<<"\n";
	while(!answer.empty()){
		cout<<answer.top()<<"\n";
		answer.pop();
	}
	return 0;
}
2024/7/18 14:39
加载中...