UVA 610 - Street Directions

option=com_onlinejudge&Itemid=8&page=show_problem&category=546&problem=551&mosmsg=Submission+received+with+ID+14124664" target="_blank" style="">题目链接

题意:给定一个无向图,要求把尽可能多的边定向,使得形成一个强连通图,输出定向后的图。不能定向的边就变成两条有向边

思路:找出割边。仅仅有割边是须要定成两条的。其它的双连通分量中,边肯定都能够定向,然后在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;
}

最新文章

  1. iOS项目中的version和build
  2. Oracle用户、权限、角色管理
  3. js ajax上传图片到服务器
  4. 下一个系列学习列表Spring.net+NHibernate+MVC
  5. 超轻量级spring模板方案
  6. 手写一个自己的简单MVC框架myPHP
  7. 【转】java list用法示例详解
  8. 一个简单的Servlet工具
  9. ListView遍历每个Item出现NullPointerException的异常处理(转)
  10. dom4j之小小工具
  11. 转-Web Service中三种发送接受协议SOAP、http get、http post
  12. JDK内置工具使用(jps、jstack、jmap、jstat)
  13. ubuntu 安装 eclipse 及其CDT
  14. 钉钉接口:获取accessToken和打卡记录【分享】
  15. 转 VMware虚拟机三种联网方式(图文详细解说)
  16. 【个人博客作业II】代码复审结果
  17. 得到body相对定位的插件
  18. ES6 中 let and const
  19. shell工具-sed
  20. POJ 3349&amp;&amp;3274&amp;&amp;2151&amp;&amp;1840&amp;&amp;2002&amp;&amp;2503

热门文章

  1. fedora安装rails缺少js runtime和cannot load such file -- sqlite3/sqlite3_native解决办法
  2. [错误处理]: How to deal with chrome failing to launch GPU process
  3. 九度oj 题目1452:搬寝室
  4. 分区脚本(fdisk)
  5. 相机拍照功能之权限和Android版本问题
  6. WTForms 表单动态验证
  7. Junit框架使用--JUnit常用断言及注解
  8. 马士兵hadoop第一课:虚拟机搭建和安装hadoop及启动(转)
  9. 同余方程(codevs 1200)
  10. poj 3293 Rectilinear polygon