30pts 求调(玄1或2关)
查看原帖
30pts 求调(玄1或2关)
1287433
ycyxh1楼主2025/6/27 12:32
#include<bits/stdc++.h>
using namespace std;
int n,m,ans,sum[100005];
struct Node{
	int u,v,w;
}a[200005];
struct node{
	queue<int>q;	
}qwq[100005];
queue<int>q,q1;
int main(){
	ios::sync_with_stdio(0),cin.tie(0),cout.tie(0);
	cin>>n>>m;
	for(int i=1;i<=m;i++){
		cin>>a[i].u>>a[i].v;
	}
	for(int i=m;i>=1;i--){
		if(a[i].u==a[i].v){
			a[i].w=qwq[a[i].u].q.size();
		}
		else{
			a[i].w=qwq[a[i].u].q.size()+qwq[a[i].v].q.size();
		}
		qwq[a[i].u].q.push(i);
		qwq[a[i].v].q.push(i);
	}
	a[m+1]={n+1,n+1,(int)1e9};
	for(int i=1;i<=n;i++){
		qwq[i].q.push(m+1);
	}
	for(int i=1;i<=m;i++){
		if(a[i].w==0){
			q.push(i);
		}
	}
//	cout<<q.size();
	while(q.size()){
		ans++;
		while(q.size()){
			int x=q.front();
			q.pop();
			sum[a[x].u]++;
			sum[a[x].v]++;
			qwq[a[x].u].q.pop();
			qwq[a[x].v].q.pop();
			a[qwq[a[x].u].q.front()].w-=sum[a[x].u];
			if(a[qwq[a[x].u].q.front()].w==0){
				q1.push(qwq[a[x].u].q.front());
			}
			a[qwq[a[x].v].q.front()].w-=sum[a[x].v];
//			cout<<a[1].w<<' '<<x<<' '<<qwq[a[x].u].q.front()<<' '<<qwq[a[x].v].q.front()<<' '<<a[x].u<<' '<<a[x].v<<'\n';
			if(a[qwq[a[x].v].q.front()].w==0){
				q1.push(qwq[a[x].u].q.front());
			}
		}
		while(q1.size()){
			q.push(q1.front());
			q1.pop();
		}
	}
	cout<<ans;
	return 0;
}
2025/6/27 12:32
加载中...