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;
}
posted @ 2021-03-11 16:56  Dazzling!  阅读(29)  评论(0编辑  收藏  举报