给一个有向图着色,使得没有一个环只有一个颜色,需要最小化使用颜色的数量。

Solution

如果图中没有环,那么显然只需要一种颜色

如果图中有环,则将 DFS 树中所有横叉边和树边染成 \(1\),返祖边染成 \(2\) 即可,故只需要两种颜色

#include <bits/stdc++.h>
using namespace std;

#define int long long
const int N = 1000005;

vector <pair<int,int> > g[N];
int n,m,t1,t2,t3,c[N],vis[N],sta[N];

void dfs(int p) {
    vis[p]=1; sta[p]=1;
    for(pair<int,int> pr:g[p]) {
        int q=pr.first, w=pr.second;
        if(sta[q]) c[w]=2;
        else c[w]=1;
        if(vis[q]==0) dfs(q);
    }
    sta[p]=0;
}

signed main() {
    ios::sync_with_stdio(false);
    cin>>n>>m;
    for(int i=1;i<=m;i++) {
        cin>>t1>>t2;
        g[t1].push_back({t2,i});
    }
    for(int i=1;i<=n;i++) if(!vis[i]) dfs(i);
    if(*max_element(c+1,c+m+1)==1) cout<<1<<endl;
    else cout<<2<<endl;
    for(int i=1;i<=m;i++) cout<<c[i]<<" ";
}

相关文章: