CF1217D Coloring Edges(思维)
小明是一个国王,他的国家有n个城市
现在小明想为这n个城市制造m条路径(路径都是有向的),现在小明有k种不同种类的材料,可以用来制造路径
无自环,无重复边
在制造路径的时候,小明不想看到一个环的路径都是由一种材料制造成的,这样小明就会生气
现在问你这个k最小值应该是多少呢
题解:
/* * CF1217D * 题意: * 给一个有向图染色,使得没有一个环只有一个颜色,需要最小化使用颜色的数量 * 如果图中没有环,那么显然只需要一种颜色 * 如果图中有环,则将DFS树中所有横叉边和树边染成1,返祖边染成2即可,故只需要两种颜色 */ #include<bits/stdc++.h> using namespace std; const int maxn=1e6+100; struct node { int u,v,next; }edge[maxn<<1]; int head[maxn],tot; void addedge (int u,int v) { edge[tot].u=u; edge[tot].v=v; edge[tot].next=head[u]; head[u]=tot++; } int N,M; int visit[maxn]; int low[maxn]; int c[maxn];//标记颜色 void dfs (int u) { visit[u]=1; low[u]=1; for (int i=head[u];i!=-1;i=edge[i].next) { int v=edge[i].v; if (low[v]) c[i]=2; else c[i]=1; if (!visit[v]) dfs(v); } low[u]=0; } int main () { scanf("%d%d",&N,&M); for (int i=1;i<=N;i++) head[i]=-1; for (int i=0;i<M;i++) { int u,v; scanf("%d%d",&u,&v); addedge(u,v); } for (int i=1;i<=N;i++) if (!visit[i]) dfs(i); if (*max_element(c,c+M)==1) printf("1\n"); else printf("2\n"); for (int i=0;i<M;i++) printf("%d ",c[i]); }