Codeforces - Trips

题目链接:Codeforces - Trips


加边不好想,所以我们直接反向删边。

每次删除一条边,那么对应两个点的度都减1,每次都把度小于k的删掉,剩下的点就是答案。

删点直接标记即可,删边在set里面删除。


AC代码:

#pragma GCC optimize("-Ofast","-funroll-all-loops")
#include<bits/stdc++.h>
//#define int long long
using namespace std;
const int N=2e5+10;
int dag[N],n,m,k,a[N],b[N],vis[N],cnt,res[N],ans;
set<int> g[N];
inline void add(int x,int y){
	dag[x]++,dag[y]++,g[x].insert(y),g[y].insert(x);
}
void del(int x){
	if(vis[x])	return ;
	vis[x]=1;	ans--;
	for(auto to:g[x]){
		if(--dag[to]<k)	del(to);
	}
}
signed main(){
	cin>>n>>m>>k;	ans=n;
	for(int i=1;i<=m;i++)	scanf("%d %d",&a[i],&b[i]),add(a[i],b[i]);
	for(int i=1;i<=n;i++)	if(dag[i]<k)	del(i);
	for(int i=m;i>=1;i--){
		res[i]=ans;
		if(vis[a[i]]||vis[b[i]])	continue;
		dag[a[i]]--,dag[b[i]]--;
		g[a[i]].erase(b[i]),g[b[i]].erase(a[i]);
		if(dag[a[i]]<k)	del(a[i]);
		if(dag[b[i]]<k)	del(b[i]);
	}
	for(int i=1;i<=m;i++)	printf("%d\n",res[i]);
	return 0;
}
发布了553 篇原创文章 · 获赞 242 · 访问量 3万+

猜你喜欢

转载自blog.csdn.net/weixin_43826249/article/details/104262197