给一个有向图着色,使得没有一个环只有一个颜色,需要最小化使用颜色的数量。
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]<<" ";
}