|邻接表 dfs|L2-3 图着色问题 (25分)

#include <iostream>
#include <cstdio>
#include <vector>
#include <set>
#include <cstring>
using namespace std;
vector<int > v[10010];
bool vis[10010];
int color[10010];

bool dfs(int id){
    
    //1

    vis[id]=true;
    
    for(int j=0;j<v[id].size();j++){
    
    
        int u=v[id][j];
        if(color[u]==color[id]){
    
    
            return false;
        }else if(vis[u]==false){
    
    
            dfs(u);
        }
    }
    return true;
    
}

int main()
{
    
    
    int n,e,k;
    cin>>n>>e>>k;
    for(int i=0;i<e;i++){
    
    
        int a,b;
        cin>>a>>b;
        v[a].push_back(b);
        v[b].push_back(a);
    }
    int num;
    cin>>num;
    
    for(int i=0;i<num;i++){
    
    
        memset(vis,0,sizeof(vis));
        memset(color,-1,sizeof(color));
        set<int>s;
        for(int j=0;j<n;j++){
    
    
            scanf("%d",&color[j+1]);
            s.insert(color[j+1]);
        }
        if(s.size()!=k){
    
    
            cout<<"No\n";
            continue;
        }
        bool flag;
		for(int i=0;i<n;i++){
    
    
            //vis[i+1]=true;
			flag=dfs(i+1);//顶点和颜色都从1到V编号
			if(flag==false){
    
    
				cout<<"No\n";
				break;
			}
		}
		if(flag==true)cout<<"Yes\n";

	}
    return 0;
}

猜你喜欢

转载自blog.csdn.net/weixin_44769957/article/details/108909122
今日推荐