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;
}

UVA 610 - Street Directions(割边)的更多相关文章

  1. UVALive 5412 Street Directions

    Street Directions Time Limit: 3000ms Memory Limit: 131072KB This problem will be judged on UVALive. ...

  2. POJ 1515 Street Directions (边双连通)

    <题目链接> 题目大意: 有m条无向边,现在把一些边改成有向边,使得所有的点还可以互相到达.输出改变后的图的所有边(无向边当成双向的有向边输出). 解题分析: 因为修改边后,所有点仍然需要 ...

  3. Sabotage UVA - 10480 (输出割边)

    题意:....emm...就是一个最小割最大流,.,...用dinic跑一遍.. 然后让你输出割边,就是 u为能从起点到达的点,  v为不能从起点到达的点 最后在残余路径中用dfs跑一遍  能到达的路 ...

  4. Uva 796 Critical Links (割边+排序)

    题目链接: Uva 796 Critical Links 题目描述: 题目中给出一个有可能不连通的无向图,求出这个图的桥,并且把桥按照起点升序输出(还有啊,还有啊,每个桥的起点要比终点靠前啊),这个题 ...

  5. POJ 1515 Street Directions --一道连通题的双连通和强连通两种解法

    题意:将一个无向图中的双向边改成单向边使图强连通,问最多能改多少条边,输出改造后的图. 分析: 1.双连通做法: 双连通图转强连通图的算法:对双连通图进行dfs,在搜索的过程中就能按照搜索的方向给所有 ...

  6. UVA610 - Street Directions(Tarjan)

    option=com_onlinejudge&Itemid=8&category=153&page=show_problem&problem=551"> ...

  7. POJ 1515 Street Directions

    题意: 一幅无向图  将尽量多的无向边定向成有向边  使得图强连通  无向图保证是连通的且没有重边 思路: 桥必须是双向的  因此先求边双连通分量  并将桥保存在ans中 每一个双连通分量内的边一定都 ...

  8. uva 610(tarjan的应用)

    题目链接:http://acm.hust.edu.cn/vjudge/problem/viewProblem.action?id=23727 思路:首先是Tarjan找桥,对于桥,只能是双向边,而对于 ...

  9. 【转】Tarjan&LCA题集

    转自:http://blog.csdn.net/shahdza/article/details/7779356 [HDU][强连通]:1269 迷宫城堡 判断是否是一个强连通★2767Proving ...

随机推荐

  1. 【转】Linux多命令顺序执行连接符(; || && |)

    当我们需要一次执行多个命令的时候,命令之间需要用连接符连接,不同的连接符有不同的效果.下面我们总结一下,加以区分. (1)  ;  分号,没有任何逻辑关系的连接符.当多个命令用分号连接时,各命令之间的 ...

  2. equals()和hashCode()方法在集合类set中的使用

    Object的方法 equals()和hashCode() 是用来判断两个对象是否相等.基础类型判断是否相等时,使用“==”来判断,按java的说话,“==”当用来判断是基础类型是判断内容的,而引用对 ...

  3. 解决vue、cnpm造成的样式错位问题

    删除node_modules文件夹使用npm install不要使用cnpm install

  4. HDU——1058Humble Numbers(找规律)

    Humble Numbers Time Limit: 2000/1000 MS (Java/Others)    Memory Limit: 65536/32768 K (Java/Others) T ...

  5. 刷题总结——array(ssoj)

    题目: 题目描述 给定 2 个正整数序列 A1, A2,序列长度分别为 L1, L2.你可以进行以下的一次操作:1. 选择两个数 K1,K2(1≤K1≤L1, 1≤K2≤L2):2. 移去 A1 中最 ...

  6. zoj 2974 Just Pour the Water矩阵快速幂

    Just Pour the Water Time Limit: 2 Seconds      Memory Limit: 65536 KB Shirly is a very clever girl. ...

  7. 【CF1016A】Death Note(签到)

    题意:无限页的书,每页可以写m个名字,给你一个长度为n的序列,序列为你每天要写的名字数,输出你每天要翻的页数. n<=2e5,m,a[i]<=1e9 思路: #include<cst ...

  8. 转 Python常见数据结构整理

    http://www.cnblogs.com/jeffwongishandsome/archive/2012/08/05/2623660.html Python常见数据结构整理 Python中常见的数 ...

  9. LeetCode OJ——Text Justification

    http://oj.leetcode.com/problems/text-justification/ 编译代码要看warnings!它提供了可能出问题的情况,比如类型转换上unsigned int ...

  10. 常用函数和STL

    #include <bits/stdc++.h> using namespace std; #define PI acos(-1.0) int main() { printf(" ...