染色问题WA97求调


思路:对于每个p[i] (代码中a[i].x)在适当的时间存入队列并BFS

#include <bits/stdc++.h>
using namespace std;
bool vis[200005];
int ans=0,k;
vector <int> v[200005];
struct node{
	int x,y;
}a[200005];
bool cmp(node a,node b){
	return a.y>b.y;
}
queue<int> q1;
queue<int> q2;
void bfs(){
	int cnt=1;
	q1.push(a[cnt].x);
	q2.push(a[cnt].y);
	vis[a[cnt].x]=true;
    while(a[cnt+1].y==a[1].y&&cnt<k){
        q1.push(a[cnt+1].x);
        q2.push(a[cnt+1].y);
        vis[a[cnt+1].x]=true;
        cnt++;
    }
    while(!q1.empty()){
    	int xx=q1.front();
    	q1.pop();
		int yy=q2.front()-1;
		q2.pop();
		while(a[cnt+1].y==yy&&cnt<k){
			cnt++;
			vis[a[cnt].x]=true;
			q1.push(a[cnt].x);
			q2.push(a[cnt].y);
		}
        if(v[xx].size()==0&&yy!=0){
            q1.push(xx);
            q2.push(yy);
        }
		for(int i=0;i<v[xx].size();i++){
			if(vis[v[xx][i]]==true){
				continue;
			}
			vis[v[xx][i]]=true;
			if(yy!=0){
				q1.push(v[xx][i]);
				q2.push(yy);
			}
		}
	}
}
int main()
{
	int n,m,l,r;
	cin>>n>>m>>k;
	for(int i=1;i<=m;i++){
		cin>>l>>r;
		v[l].push_back(r);
		v[r].push_back(l);
	}
	for(int i=1;i<=k;i++){
		cin>>a[i].x>>a[i].y;
	}
	sort(a+1,a+1+k,cmp);
	bfs();
	for(int i=1;i<=n;i++){
		if(vis[i]){
			ans++;
		}
	}
	cout<<ans<<"\n";
	for(int i=1;i<=n;i++){
		if(vis[i]){
			cout<<i<<" ";
		}
	}
	return 0;
}

不是,有那么复杂吗?

就48行
image

你就这样,一个广搜,一个队列就行了。首先,开一个数组记录每个点的强度。
每次进行比较
image
每次去最大的强度的点,这样就行了

我想知道我的代码有什么问题?