Educational Codeforces Round 72 (Rated for Div. 2) D. Coloring Edges

14276 단어
https://codeforc.es/contest/1217/problem/D
You are given a directed graph with n vertices and m directed edges without self-loops or multiple edges.
Let’s denote the k-coloring of a digraph as following: you color each edge in one of k colors. The k-coloring is good if and only if there no cycle formed by edges of same color.
Find a good k-coloring of given digraph with minimum possible k.
Input The first line contains two integers n and m (2≤n≤5000, 1≤m≤5000) — the number of vertices and edges in the digraph, respectively.
Next m lines contain description of edges — one per line. Each edge is a pair of integers u and v (1≤u,v≤n, u≠v) — there is directed edge from u to v in the graph.
It is guaranteed that each ordered pair (u,v) appears in the list of edges at most once.
Output In the first line print single integer k — the number of used colors in a good k-coloring of given graph.
In the second line print m integers c1,c2,…,cm (1≤ci≤k), where ci is a color of the i-th edge (in order as they are given in the input).
If there are multiple answers print any of them (you still have to minimize k).
제목: 방향도를 주고 모든 변을 염색하여 고리에 포함된 변이 한 가지 색만 있고 최소 색수와 염색 방안을 출력합니다.
벡터가 있는 고리에 대해 이런 성질이 있다. 번호가 작은 점은 번호가 큰 점과 번호가 큰 점은 번호가 작은 점의 변을 가리키는 것이 반드시 동시에 존재한다. 따라서 우리는 모든 작은 손가락이 큰 변을 1로 염색하고 큰 손가락이 작은 변을 2로 염색하면 그림에 같은 색 고리가 존재하지 않는다는 것을 보장할 수 있다.그러면 문제는 판단도에 고리가 있는지 없는지를 판단하는 것으로 변한다. 이것은 마음대로 하고 토폴로지 순서와 dfs는 모두 가능하다.
코드:
#include
#include
#include
#include
#include
#include
#include
//#include
using namespace std;
#define PB push_back
#define LL long long
#define FI first
#define SE second
#define POP pop_back()
#define PII pair
#define endl '
'
#define ls x<<1 #define rs x<<1|1 #define m(x) a[x].l+a[x].r>>1 #define ST cin>>n;for(int i=1;i<=n;i++)scanf("%d",&a[i]); #define debug cout< const int N=5007,mod=998244353; int n,m; PII a[N]; vector<int>v[N]; bool f[N]; int d[N]; int main() { cin>>n>>m; int flag=0; for(int i=1;i<=m;i++){ scanf("%d%d",&a[i].FI,&a[i].SE); v[a[i].FI].PB(a[i].SE); d[a[i].SE]++; } for(int i=1;i<=n;i++){// int mn=0; for(int j=1;j<=n;j++){ if(d[j]==0&&f[j]==0)mn=j; } f[mn]=1; if(mn==0){ flag=1;break; } for(int j=0;j<v[mn].size();j++){ d[v[mn][j]]--; } } if(flag==0){ cout<<1<<endl; for(int i=1;i<=m;i++){ printf("1 "); } } else{ cout<<2<<endl; for(int i=1;i<=m;i++){ if(a[i].FI<a[i].SE)printf("1 "); else printf("2 "); } } return 0; } /* */

좋은 웹페이지 즐겨찾기