POJ 1515 Street Directions (边双连通)
<题目链接>
题目大意:
有m条无向边,现在把一些边改成有向边,使得所有的点还可以互相到达。输出改变后的图的所有边(无向边当成双向的有向边输出)。
解题分析:
因为修改边后,所有点仍然需要相互可达,所以原无向图中所有的割边仍然只能是双向边,而对于双连通分量中的边,可以将其中的一些边删除。不难想到,在保证图中所有点仍然相互可达的情况下,当将其删成强连通分量的方案是最优的。
#include <cstdio>
#include <cstring>
#include <iostream>
using namespace std; const int N = , M = N * N; struct Edge {
int from, to, nxt,cut;
} edge[M]; int dfn[N],low[N],head[N];
int n, m,tot,cnt;
inline void init(){
tot = cnt = ;
memset(dfn, , sizeof dfn);
memset(head, -, sizeof head);
}
inline void add(int u,int v){
edge[cnt]=(Edge){u,v,head[u],};
head[u]=cnt++;
}
void Tarjan(int u, int pre){
dfn[u] = low[u] = ++tot;
for (int i=head[u];~i;i=edge[i].nxt){
int v=edge[i].to;
if (edge[i].cut) continue; //如果这个边已经被标记了(标记为-1也是被标记过),则无需改变之前的标记,因为只需要找到一种可行的标记方案即可
edge[i].cut=;edge[i^].cut=-; //贪心的将一个方向的边标记
if (v == pre) continue;
if (!dfn[v]){
Tarjan(v, u);
low[u] = min(low[u], low[v]);
if (dfn[u] < low[v])edge[i].cut=edge[i^].cut=;
}
else low[u] = min(low[u], dfn[v]);
}
}
inline void Solve(){
for (int i = ; i < cnt; ++i)
if (edge[i].cut==)printf("%d %d\n", edge[i].from, edge[i].to);
printf("#\n");
}
int main(){
int ncase=;
while(~scanf("%d%d",&n,&m),n||m){
printf("%d\n\n",++ncase);
init();
for(int i=;i<=m;i++){
int u,v;scanf("%d%d", &u, &v);
add(u,v);add(v,u);
}
Tarjan(, -);
Solve();
}
}
POJ 1515 Street Directions (边双连通)的更多相关文章
- POJ 1515 Street Directions --一道连通题的双连通和强连通两种解法
题意:将一个无向图中的双向边改成单向边使图强连通,问最多能改多少条边,输出改造后的图. 分析: 1.双连通做法: 双连通图转强连通图的算法:对双连通图进行dfs,在搜索的过程中就能按照搜索的方向给所有 ...
- POJ 1515 Street Directions
题意: 一幅无向图 将尽量多的无向边定向成有向边 使得图强连通 无向图保证是连通的且没有重边 思路: 桥必须是双向的 因此先求边双连通分量 并将桥保存在ans中 每一个双连通分量内的边一定都 ...
- POJ 3177 Redundant Paths (边双连通+缩点)
<题目链接> <转载于 >>> > 题目大意: 有n个牧场,Bessie 要从一个牧场到另一个牧场,要求至少要有2条独立的路可以走.现已有m条路,求至少要新 ...
- poj 2117 Electricity【点双连通求删除点后最多的bcc数】
Electricity Time Limit: 5000MS Memory Limit: 65536K Total Submissions: 4727 Accepted: 1561 Descr ...
- poj 1523 SPF【点双连通求去掉割点后bcc个数】
SPF Time Limit: 1000MS Memory Limit: 10000K Total Submissions: 7246 Accepted: 3302 Description C ...
- poj 3694 Network 边双连通+LCA
题目链接:http://poj.org/problem?id=3694 题意:n个点,m条边,给你一个连通图,然后有Q次操作,每次加入一条边(A,B),加入边后,问当前还有多少桥,输出桥的个数. 解题 ...
- poj1515--Street Directions(边的双连通)
给一个无向图,要求变成强连通的有向图,需要保留哪些边. 边的双连通,对于桥保留两条边,其他的只保留一条边.求双连通的过程中记录保留边. /******************************* ...
- poj 3177 Redundant Paths(tarjan边双连通)
题目链接:http://poj.org/problem?id=3177 题意:求最少加几条边使得没对点都有至少两条路互通. 题解:边双连通顾名思义,可以先求一下连通块显然连通块里的点都是双连通的,然后 ...
- poj 3352 Road Construction【边双连通求最少加多少条边使图双连通&&缩点】
Road Construction Time Limit: 2000MS Memory Limit: 65536K Total Submissions: 10141 Accepted: 503 ...
随机推荐
- purge旧的ubuntu 的linux内核
https://www.sysgeek.cn/remove-old-kernels-ubuntu-16-04/
- Loj #528. 「LibreOJ β Round #4」求和 (莫比乌斯反演)
题目链接:https://loj.ac/problem/528 题目:给定两个正整数N,M,你需要计算ΣΣu(gcd(i,j))^2 mod 998244353 ,其中i属于[1,N],j属于[1,M ...
- docker的基础命令
详细命令参考http://www.runoob.com/docker/docker-command-manual.html
- ComboBox下拉列表框
属性:DropDownStyle(下拉.可编辑等).Items(条目) 事件:SelectedIndexChanged选择项改变触发 Items内容:总经理.副总经理.财务部 DropDownStyl ...
- org.hibernate.ObjectNotFoundException: No row with the given identifier exists解决办法
hibernate-取消关联外键引用数据丢失抛异常的设置@NotFound hibernate项目里面配了很多many-to-one的关联,后台在查询数据时已经作了健全性判断,但还是经常抛出对象找不到 ...
- 如何在IntelliJ IDEA中使用.ignore插件忽略不必要提交的文件
如何在IntelliJ IDEA中使用.ignore插件忽略不必要提交的文件 最近初学Git,而且在使用的IDE是IntelliJ IDEA,发现IDEA在提交项目到本地仓库的时候,会把.idea文件 ...
- Javaweb学习笔记——(二十八)——————Servlet3.0、动态代理、类加载器
web最后一天:完了. Servlet3.0 一.要求 1.MyEclipse10.0或以上版本 2.发布到Tomcat7.0或以上版本 二.步骤 ...
- ORACLE使用CASE WHEN的方法
先写草稿. 说下我的需求,ORACLE数据库有两个字段RECEIVER_MOBILE与RECEIVER_PHONE,同为联系方式.当RECEIVER_MOBILE为空的时候,需要用到RECEIVER_ ...
- SpringBoot中Application开启与关闭
0.声明 缘由:没有学过或者没有经历SpringBoot的Application运行机制的话,一定会好奇,博主为啥会写一篇关闭开启的博文,是不是好幼稚?(/o(╥﹏╥)o),待我娓娓道来......为 ...
- C#利用VUDP.cs开发网络通讯应用例程
VClassLib-CS项目Github地址:https://github.com/velscode/VClassLib-CS VUDP文档地址:https://github.com/velscode ...