CF1217D Coloring Edges
题意
- 给一个有向图的边着色
- 使得没有一个环只有一个颜色
- 您需要最小化使用颜色的数量
思路
无环时显然只有一种颜色
对于每个环,我们在搜索时可以确定的是哪条边使得他成环(即寻找到重复点的那条边)
那么只要将其他边染的和他不同,那么就可以保证有两种不同的颜色了
int res[maxn];
bool vis[maxn], flag, used[maxn];
void dfs(int now)
{
used[now] = true;
for (auto it : E[now]) {
if (used[it.first]) {
res[it.second] = 2;
flag = true;
continue;
}
res[it.second] = 1;
if(vis[it.first])
continue;
vis[it.first] = true;
dfs(it.first);
}
used[now] = false;
}
代码
#include <bits\stdc++.h>
using namespace std;
const int maxn = 1e5 + 5;
typedef pair<int, int> pii;
vector<pii> E[maxn];
int res[maxn];
bool vis[maxn], flag, used[maxn];
void dfs(int now)
{
used[now] = true;
for (auto it : E[now]) {
if (used[it.first]) {
res[it.second] = 2;
flag = true;
continue;
}
res[it.second] = 1;
if(vis[it.first])
continue;
vis[it.first] = true;
dfs(it.first);
}
used[now] = false;
}
int main()
{
int n, m;
scanf("%d%d", &n, &m);
int u, v;
for (int i = 1; i <= m; i++) {
scanf("%d%d", &u, &v);
E[u].push_back(make_pair(v, i));
}
for (int i = 1; i <= n; i++)
if (!vis[i])
dfs(i);
printf("%d\n", flag + 1);
for (int i = 1; i <= m; i++)
printf("%d ", res[i]);
return 0;
}