题目链接:
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; }