zoukankan      html  css  js  c++  java
  • 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
    ");
        else
            printf("2
    ");
        for (int i=0;i<M;i++) printf("%d ",c[i]);
    }
  • 相关阅读:
    Haskell Types与Typeclasses
    Haskell Tuple相关总结
    Haskell List相关操作
    Emacs 常用快捷键
    Emacs 参考资料
    Haskell Platform (windows)
    生成zip压缩包
    递归复制一个文件
    写表格
    读表格
  • 原文地址:https://www.cnblogs.com/zhanglichen/p/12817821.html
Copyright © 2011-2022 走看看