codeforces#1217D. Coloring Edges(图上染色)

题目链接:

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

题意:

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

数据范围:

$1\leq n \leq 5000$

$1\leq 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\n",k);
    for(int i=1;i<=m;i++){
        printf("%d",edge[i].color);
        if(i!=m)printf(" ");
        else printf("\n");
    }
    return 0;
}

  

猜你喜欢

转载自www.cnblogs.com/carcar/p/11551107.html