• 1154 Vertex Coloring (25 分)


    染色法判断是否为(k)染色图,需要一个(vis)数组防止走环路。

    const int N=10010;
    vector<int> g[N];
    bool vis[N];
    int color[N];
    int n,m,q;
    
    bool dfs(int u)
    {
        vis[u]=true;
        for(int i=0;i<g[u].size();i++)
        {
            int j=g[u][i];
            if(color[j] == color[u]) return false;
            else if(!vis[j])
            {
                if(!dfs[j]) return false;
            }
        }
        return true;
    }
    
    int main()
    {
        cin>>n>>m;
    
        while(m--)
        {
            int a,b;
            cin>>a>>b;
            g[a].pb(b);
            g[b].pb(a);
        }
    
        cin>>q;
        while(q--)
        {
            memset(vis,0,sizeof vis);
            
            set<int> S;
            for(int i=0;i<n;i++)
            {
                cin>>color[i];
                S.insert(color[i]);
            }
    
            bool ok=true;
            for(int i=0;i<n;i++)
                if(!vis[i])
                {
                    if(!dfs(i))
                    {
                        ok=false;
                        break;
                    }
                }
            
            if(ok)
                cout<<S.size()<<"-coloring"<<endl;
            else
                puts("No");
        }
        //system("pause");
        return 0;
    }
    

    也可直接枚举每条边。

    const int N=10010;
    PII e[N];
    int color[N];
    int n,m,q;
    
    int main()
    {
        cin>>n>>m;
    
        for(int i=0;i<m;i++)
            cin>>e[i].fi>>e[i].se;
    
        cin>>q;
        while(q--)
        {
            unordered_set<int> S;
            for(int i=0;i<n;i++)
            {
                cin>>color[i];
                S.insert(color[i]);
            }
    
            bool ok=true;
            for(int i=0;i<m;i++)
            {
                int a=e[i].fi,b=e[i].se;
                if(color[a] == color[b])
                {
                    ok=false;
                    break;
                }
            }
    
            if(ok) cout<<S.size()<<"-coloring"<<endl;
            else puts("No");
        }
        //system("pause");
        return 0;
    }
    
  • 相关阅读:
    简单工厂
    Asp.Net Catch的应用
    ADO和ADO.NET的区别
    PLSql语句学习(三)
    三层结构的B/S系统(收藏)
    MVC 模式
    利用.net反射动态调用指定程序集的中的方法
    .NET反射的简单示例
    ToString格式化
    HTML:关于位置的几个概念
  • 原文地址:https://www.cnblogs.com/fxh0707/p/14519033.html
Copyright © 2020-2023  润新知