zoukankan      html  css  js  c++  java
  • codeforces#1217D. Coloring Edges(图上染色)

    题目链接:

    https://codeforces.com/contest/1217/problem/D

    题意:

    给图染上$k$种颜色,相同颜色不能形成一个环

    数据范围:

    $1leq n leq 5000$

    $1leq m leq 5000$

    分析: 

    分类讨论:

    1,不存在环,明显涂上一种颜色

    2,存在环,那么肯定的是,每个环至少存在一条边从大编号节点到小编号节点,一条边从小编号节点到大编号节点

    那么,给第一种边染上一种颜色,第二种边染上另一种颜色,肯定不存在相同颜色形成一个环

    AC代码:

    #include<bits/stdc++.h>
    #define ll long long
    #define pii pair<int,int>
    using namespace std;
    const int maxn=5000+7;
    struct Edge{
        int a,b,color;
    }edge[maxn];
    int n,m,vis[maxn],now,k=1;
    vector<int>ve[maxn];
    void dfs(int x){
        if(vis[x]){
            if(x==now)k=2;
            return ;
        }
        vis[x]=1;
        for(int i=0;i<ve[x].size();i++)
            dfs(ve[x][i]);
    }
    
    int main()
    {
        scanf("%d %d",&n,&m);
        for(int i=1;i<=m;i++){
            int a,b;
            scanf("%d %d",&a,&b);
            edge[i]=(Edge){a,b,-1};
            ve[a].push_back(b);
        }
        for(int i=1;i<=n;i++){
            for(int j=1;j<=n;j++)vis[j]=0;
            now=i;
            dfs(i);
        }
    
        for(int i=1;i<=m;i++){
            if(k==1||edge[i].a>edge[i].b)edge[i].color=1;
            else edge[i].color=2;
        }
        printf("%d
    ",k);
        for(int i=1;i<=m;i++){
            printf("%d",edge[i].color);
            if(i!=m)printf(" ");
            else printf("
    ");
        }
        return 0;
    }
    

      

  • 相关阅读:
    Document
    Document
    Document
    Document
    Document
    Document
    手动版 轮播图
    Echarts tooltip 自定义formatter设置字体颜色
    CSS3中 translate、transform 和 translation 的区别和联系,及开发问题解决
    background 属性及遇到的问题
  • 原文地址:https://www.cnblogs.com/carcar/p/11551107.html
Copyright © 2011-2022 走看看