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]);
}

 

posted @ 2020-05-02 13:24  zlc0405  阅读(120)  评论(0编辑  收藏  举报