题意:将一个无向图中的双向边改成单向边使图强连通,问最多能改多少条边,输出改造后的图。

分析:

1.双连通做法:

双连通图转强连通图的算法:对双连通图进行dfs,在搜索的过程中就能按照搜索的方向给所有边定向,其中桥不能改造,只能保留双向边。

代码:

#include <iostream>
#include <cstdio>
#include <cstring>
#include <cmath>
#include <cstdlib>
#include <algorithm>
#include <vector>
#include <queue>
using namespace std;
#define N 1006 vector<pair<int,int> > G[N];
int dfn[N],low[N];
int Time,vis[N];
bool isbge[],used[];
int n,m,cnt; void Tarjan(int u,int father)
{
low[u] = dfn[u] = ++Time;
vis[u] = ;
for(int i=;i<G[u].size();i++)
{
int v = G[u][i].first;
int id = G[u][i].second;
if(v == father)
continue;
if(!vis[v])
{
Tarjan(v,u);
low[u] = min(low[u],low[v]);
if(dfn[u] < low[v])
isbge[id] = ;
}
else
low[u] = min(low[u],dfn[v]);
}
} void dfs(int u,int fa)
{
vis[u] = ;
for(int i=;i<G[u].size();i++)
{
int v = G[u][i].first;
int id = G[u][i].second;
if(!used[id])
{
used[id] = ;
printf("%d %d\n",u,v);
if(isbge[id])
printf("%d %d\n",v,u);
if(!vis[v])
dfs(v,u);
}
}
} int main()
{
int i,j,u,v;
int cs = ;
while(scanf("%d%d",&n,&m)!=EOF && (n||m))
{
for(i=;i<=n;i++)
{
G[i].clear();
vis[i] = ;
low[i] = dfn[i] = ;
}
memset(used,,sizeof(used));
memset(isbge,,sizeof(isbge));
Time = ;
cnt = ; //id
for(i=;i<m;i++)
{
scanf("%d%d",&u,&v);
G[u].push_back(make_pair(v,cnt));
G[v].push_back(make_pair(u,cnt++)); //属于一条边
}
for(i=;i<=n;i++)
if(!dfn[i])
Tarjan(i,-);
memset(vis,,sizeof(vis));
printf("%d\n\n",cs++);
for(i=;i<=n;i++)
if(!vis[i])
dfs(,-);
puts("#");
}
return ;
}

2.强连通做法:

参见:http://blog.csdn.net/new_c_yuer/article/details/6733623

主要思想:在同一个连通分量里,保留单向边即可,否则需要保留双向边。

POJ 1515 Street Directions --一道连通题的双连通和强连通两种解法的更多相关文章

  1. POJ 1515 Street Directions

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

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

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

  3. POJ 1157 LITTLE SHOP OF FLOWERS (超级经典dp,两种解法)

    You want to arrange the window of your flower shop in a most pleasant way. You have F bunches of flo ...

  4. java多线程编程题之连续打印abc的几种解法

    一道编程题如下: 实例化三个线程,一个线程打印a,一个打印b,一个打印c,三个线程同时执行,要求打印出6个连着的abc 题目分析: 通过题意我们可以得出,本题需要我们使用三个线程,三个线程分别会打印6 ...

  5. 【Java面试真题】剑指Offer53.2——0~n-1中缺失的数字(异或、二分两种解法)

    [Java实现]剑指Offer53.2--0~n-1中缺失的数字:面试真题,两种思路分享 前面有另一道面试题[Java实现]剑指offer53.1--在排序数组中查找数字(LeetCode34:在排序 ...

  6. 牛客网Java刷题知识点之Map的两种取值方式keySet和entrySet、HashMap 、Hashtable、TreeMap、LinkedHashMap、ConcurrentHashMap 、WeakHashMap

    不多说,直接上干货! 这篇我是从整体出发去写的. 牛客网Java刷题知识点之Java 集合框架的构成.集合框架中的迭代器Iterator.集合框架中的集合接口Collection(List和Set). ...

  7. POJ 1979 dfs和bfs两种解法

      fengyun@fengyun-server:~/learn/acm/poj$ cat 1979.cpp #include<cstdio> #include<iostream&g ...

  8. 一道百度的java面试题的几种解法

    考试结束,班级平均分只拿到了年级第二,班主任于是问道:大家都知道世界第一高峰珠穆朗玛峰,有人知道世界第二高峰是什么吗?正当班主任要继续发话,只听到角落默默想起来一个声音:”乔戈里峰” 前言 文章出自: ...

  9. 一道JAVA经典面试题目的两种解法

    题目要求:String s="-1 2 5 78 129 -65 -23";将字符串进行升序排序后输出. 方法一:使用数组进行排序 思路: 1.获取字符串中的数值:   2.将数组 ...

随机推荐

  1. Hibernate中的一级缓存、二级缓存和懒加载(转)

    1.为什么使用缓存 hibernate使用缓存减少对数据库的访问次数,从而提升hibernate的执行效率.hibernate中有两种类型的缓存:一级缓存和二级缓存. 2.一级缓存 Hibenate中 ...

  2. saltstack学习笔记1 --安装

    salt官网:http://docs.saltstack.cn/zh_CN/latest/ 安装教程: - http://docs.saltstack.cn/zh_CN/latest/topics/i ...

  3. NYOJ 1058 部分和问题

    部分和问题 时间限制:1000 ms  |  内存限制:65535 KB 难度:2   描述 给定整数a1.a2........an,判断是否可以从中选出若干数,使它们的和恰好为K.   输入 首先, ...

  4. andriod 资源文件之存取操作

    来自:http://blog.csdn.net/jianghuiquan/article/details/8569235 <?xml version="1.0" encodi ...

  5. Sharepoint学习笔记—习题系列--70-573习题解析 -(Q45-Q47)

    Question45You create and deploy a custom Web Part.You add the Web Part to a page and receive a run-t ...

  6. ListView属性整理

    stackFromBottom属性,这只该属性之后你做好的列表就会显示你列表的最下面,值为true和false android:stackFromBottom="true"   第 ...

  7. android Java BASE64编码和解码一:基础

    今天在做Android项目的时候遇到一个问题,需求是向服务器上传一张图片,要求把图片转化成图片流放在 json字符串里传输. 类似这样的: {"name":"jike&q ...

  8. Android 正则表达式

    1.相关知识链接 正则表达式语法   https://msdn.microsoft.com/zh-cn/library/ae5bf541(v=vs.80).aspx 正则表达式入门教程   http: ...

  9. android拍照选择图片上传服务器自定义控件

    做android项目的时候总免不了遇到图片上传功能,虽然就是调用android系统的拍照和相册选择功能,但是总面部了把一大推代码写在activity里,看上去一大推代码头都昏了.不如把这些功能都集成一 ...

  10. iOS设计模式之迭代器模式

    迭代器模式 基本理解 迭代器模式(Iterrator):提供一个方法顺序访问一个聚合对象中的各个元素,而又不暴露该元素的内部表示. 当你访问一个聚合对象,而且不管这些对象是什么都需要遍历的时候,你就应 ...