Coloring Edges
一个经典结论是有向图中的任意一个环总能由一条生成树上的从祖先到儿子的链以及一条返祖边组成,正确性显然。
不妨将所有树边和横插边都染成黑色,返祖边染成白色,这样就可以保证任意一个环都有两种颜色了。
判断横插边和返祖边可以用栈来维护。
#include <bits/stdc++.h>
using namespace std;
typedef long long ll;
typedef pair<int, int> PII;
const int N = 5e3 + 5;
int n, m;
vector<PII> e[N];
int ans[N];
bool st[N], ins[N];
void dfs(int u) {
st[u] = true;
ins[u] = true;
for (auto [v, id] : e[u]) {
if (!st[v]) {
ans[id] = 1;
dfs(v);
}
else {
if (ins[v]) ans[id] = 2;
else ans[id] = 1;
}
}
ins[u] = false;
}
int main() {
ios::sync_with_stdio(false);
cin.tie(nullptr); cout.tie(nullptr);
cin >> n >> m;
for (int i = 1; i <= m; i ++) {
int u, v;
cin >> u >> v;
e[u].emplace_back(v, i);
}
for (int i = 1; i <= n; i ++) {
if (!st[i]) {
dfs(i);
}
}
cout << *max_element(ans + 1, ans + 1 + m) << '\n';
for (int i = 1; i <= m; i ++) {
cout << ans[i] << ' ';
}
return 0;
}
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· 分享一个免费、快速、无限量使用的满血 DeepSeek R1 模型,支持深度思考和联网搜索!
· 使用C#创建一个MCP客户端
· ollama系列1:轻松3步本地部署deepseek,普通电脑可用
· 基于 Docker 搭建 FRP 内网穿透开源项目(很简单哒)
· 按钮权限的设计及实现