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 ...
随机推荐
- 爬虫 requests 模块
requests 模块 介绍 使用requests可以模拟浏览器的请求, 比起之前用到的urllib,requests模块的api更加便捷(本质就是封装了urllib3) ps: requests库发 ...
- VMware下安装linux虚拟机
安装VMware [下一步] [下一步] 点击[自定义],[下一步] 更改安装目录,[下一步] [下一步] [下一步] [跳过] [完成] 点击桌面图标 如下勾选,输入邮箱,[继续] [完成] 安装l ...
- 如何修改hosts文件
如何修改hosts文件 1.进入路径 C:\Windows\System32\drivers\etc 2.拷贝hosts文件到其他地方3.修改拷贝的hosts文件,右键用记事本打开4.直接修改或添加 ...
- CMDB资产管理系统开发【day27】:理解RESTful架构
理解RESTful架构 越来越多的人开始意识到,网站即软件,而且是一种新型的软件. 这种"互联网软件"采用客户端/服务器模式,建立在分布式体系上,通过互联网通信,具有高延时(hig ...
- 第三节:Action向View传值的四种方式(ViewData、ViewBag、TempData、Model)
简 介 在前面的章节中,我们已经很清楚,MVC工作模型的流程,Controller中的Action接收到客户端的请求,处理后要将数据返回给View,那么Action中是如何将数据返回给View的,二 ...
- Chrome firefox ie等浏览器空格 宽度不一样
用半角空格 或者全角空格 相当于半格中文字符的宽度, 相当于一个中文字符宽度. 注:在chrome中两个 占一个汉字的宽度;,而在IE.firefox中四个 才占一个汉字的宽度.
- Anaconda+django安装问题
Anaconda使用中常遇到如下问题: 如果Anaconda不是最新版本,可在Anaconda Prompt中使用如下命令更新至最新版 conda update -n base -c defaults ...
- 「NOI2017」泳池
DP式子比后面的东西难推多了 LOJ2304 Luogu P3824 UOJ #316 题意 给定一个长度为$ n$高为$ \infty$的矩形 每个点有$ 1-P$的概率不可被选择 求最大的和底边重 ...
- 使用 JS 嵌入的方式来加载 Flash 插件,在各浏览器中播放视频
嵌入插件 使用 object 和 embed 标签 这种方法用到的是 Object 和 Embed 标签,可以看到 object 的很多参数和 embed 里面的很多属性是重复的.浏览器兼容性,有的浏 ...
- CF1153D Serval and Rooted Tree(树形DP)
题目链接: https://www.luogu.org/problemnew/show/CF1153D (cf崩了,贴了个落谷的) 题目大意:给你n个点,然后n-1条边,构成一棵树,每个点是子节点 ...