UVA 610 - Street Directions(割边)
2024-09-08 07:23:29
UVA 610 - Street Directions
题意:给定一个无向图,要求把尽可能多的边定向,使得形成一个强连通图,输出定向后的图。不能定向的边就变成两条有向边
思路:找出割边。仅仅有割边是须要定成两条的。其它的双连通分量中,边肯定都能够定向,然后在dfs不经过割边打印路径。最后在打印出割边(拆成两条)
代码:
#include <cstdio>
#include <cstring>
#include <vector>
using namespace std; const int N = 1005; int n, m; struct Edge {
int u, v, id;
int fan;
bool iscut, used;
Edge() {}
Edge(int u, int v, int id, int fan) {
this->u = u;
this->v = v;
this->id = id;
this->fan = fan;
used = false;
iscut = false;
}
}; int pre[N], low[N], dfs_clock; vector<Edge> g[N];
vector<Edge> cut; int dfs(int u, int fa) {
int lowu = pre[u] = ++dfs_clock;
for (int i = 0; i < g[u].size(); i++) {
int v = g[u][i].v;
int id = g[u][i].id;
if (id == fa) continue;
if (!pre[v]) {
int lowv = dfs(v, id);
lowu = min(lowu, lowv);
if (lowv > pre[u]) {
cut.push_back(g[u][i]);
g[u][i].iscut = true;
g[v][g[u][i].fan].iscut = true;
}
} else lowu = min(lowu, pre[v]);
}
return low[u] = lowu;
} void find_cut(int n) {
cut.clear();
memset(pre, 0, sizeof(pre));
dfs_clock = 0;
for (int i = 0; i < n; i++) {
if (!pre[i]) {
dfs(i, 0);
}
}
} int vis[N]; void print(int u) {
vis[u] = 1;
for (int i = 0; i < g[u].size(); i++) {
if (g[u][i].iscut) continue;
if (g[u][i].used) continue;
int v = g[u][i].v;
g[u][i].used = true;
g[v][g[u][i].fan].used = true;
printf("%d %d\n", u + 1, v + 1);
if (vis[v]) continue;
print(v);
}
} int main() {
int cas = 0;
while (~scanf("%d%d", &n, &m) && n || m) {
int u, v;
for (int i = 0; i < n; i++)
g[i].clear();
for (int i = 1; i <= m; i++) {
scanf("%d%d", &u, &v);
u--; v--;
g[u].push_back(Edge(u, v, i, g[v].size()));
g[v].push_back(Edge(v, u, i, g[u].size() - 1));
}
find_cut(n);
printf("%d\n\n", ++cas);
memset(vis, 0, sizeof(vis));
for (int i = 0; i < n; i++)
if (!vis[i]) print(i);
for (int i = 0; i < cut.size(); i++) {
printf("%d %d\n", cut[i].u + 1, cut[i].v + 1);
printf("%d %d\n", cut[i].v + 1, cut[i].u + 1);
}
printf("#\n");
}
return 0;
}
最新文章
- iOS项目中的version和build
- Oracle用户、权限、角色管理
- js ajax上传图片到服务器
- 下一个系列学习列表Spring.net+NHibernate+MVC
- 超轻量级spring模板方案
- 手写一个自己的简单MVC框架myPHP
- 【转】java list用法示例详解
- 一个简单的Servlet工具
- ListView遍历每个Item出现NullPointerException的异常处理(转)
- dom4j之小小工具
- 转-Web Service中三种发送接受协议SOAP、http get、http post
- JDK内置工具使用(jps、jstack、jmap、jstat)
- ubuntu 安装 eclipse 及其CDT
- 钉钉接口:获取accessToken和打卡记录【分享】
- 转 VMware虚拟机三种联网方式(图文详细解说)
- 【个人博客作业II】代码复审结果
- 得到body相对定位的插件
- ES6 中 let and const
- shell工具-sed
- POJ 3349&;&;3274&;&;2151&;&;1840&;&;2002&;&;2503
热门文章
- fedora安装rails缺少js runtime和cannot load such file -- sqlite3/sqlite3_native解决办法
- [错误处理]: How to deal with chrome failing to launch GPU process
- 九度oj 题目1452:搬寝室
- 分区脚本(fdisk)
- 相机拍照功能之权限和Android版本问题
- WTForms 表单动态验证
- Junit框架使用--JUnit常用断言及注解
- 马士兵hadoop第一课:虚拟机搭建和安装hadoop及启动(转)
- 同余方程(codevs 1200)
- poj 3293 Rectilinear polygon