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

分析:

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. sso demo ( cas )

    1. generate keystore command : keytool -genkey -alias testtomcat -keyalg RSA -keystore "C:\User ...

  2. LGLAlertView 提示框

    使用与iOS8 以后,只是把系统的UIAlertController进行了封装,省的每次用的时候要写很多的代码.封装后只需要一句代码即可 , deome 地址:https://github.com/l ...

  3. Python tools for Visual Studio插件介绍

          Python tools for Visual Studio是一个免费开源的VisualStudio的插件,支持 VisualStudio 2010,2012与2013.我们想要实现的是: ...

  4. 安全协议:SSL、TSL、SSH概述

    SSL(Secure Socket Layer--安全套接字层):为网络通信安全以及数据完整性提供保障的一种安全协议,在TCP/IP的传输层对网络连接进行加密: TSL(Transport Layer ...

  5. 【JavaEE】Hibernate继承映射,不用多态查询只查父表的方法

    几个月前,我在博问里面发了一个问题:http://q.cnblogs.com/q/64900/,但是一直没有找到好的答案,关闭问题以后才自己解决了,在这里分享一下. 首先我重复一下场景,博问里面举的动 ...

  6. SharePoint 中用户控件的开发及应用

    1.新建解决方案以及SharePoint项目,步骤比较简单略过,然后映射CONTROLTEMPLATES文件夹,在里面添加用户控件(仅场解决方案),如下图: 2.解决方案结构,如下图: 简单介绍一下, ...

  7. thinkPHP学习笔记(1)

    现在对前端的要求越来越高了  基本上身为一个前端人员需要会一种后台语言,于是选择了当下流行的php.因为是自学对我这个不怎么懂代码的人来说还是有点难度的. 1.先看看thinkphp的目录结构 ├─T ...

  8. 解决SwipeRefreshLayout左右滑动事件冲突的问题

    在使用SwipeRefreshLayout时我们注意到在SwipeRefreshLayout中左右滑动时可能也会触发下拉刷新的事件,这点让我们很不爽.追其原因是SwipeRefreshLayout对于 ...

  9. Web应用程序系统的多用户权限控制设计及实现-项目架构【3】

    本章主要讲述Web权限管理系统的项目架构,及开发中需要的基本类和相关的CSS,JS文件. 1.1系统结构 本系统搭建开发工具为Visual Studio 2012,采用ASP.NET MVC 4.0技 ...

  10. C语言-12-日期和时间处理标准库详细解析及示例

    概述 标准库 提供了用于日期和时间处理的结构和函数 是C++语言日期和时间处理的基础 与时间相关的类型 clock_t,本质是:unsigned long typedef unsigned long ...