hdu 3394 Railway
这是一道用tarjin求双连通分量的题;
其中,不需要修的道路就是桥的数目;
在图的每个极大环中,如果点的数目小于边的数目,显然这个环中含有子环,并且这个环的边数就是这个环中有冲突的边的数目;
如果点的数模等于边的数目,那就没有冲突;
代码:
#include<cstdio>
#include<vector>
#include<cstring>
using namespace std;
#define maxn 10005 vector<int>g[maxn];
int block[maxn],top,stack[maxn],dfn[maxn],low[maxn],index,res1,res2;
bool instack[maxn],vis[maxn]; void count_edge()
{
memset(vis,,sizeof vis);
for(int i=; i<=block[]; i++)
vis[block[i]]=;
int sum=;
for(int i=; i<=block[]; i++)
{
int w=block[i];
for(int j=; j<g[w].size(); j++)
if(vis[g[w][j]])
sum++;
}
sum/=;//这个块中的边数
if(sum<block[])
res1+=sum;
if(sum>block[])
res2+=sum;
}
void tarjan(int v)
{
dfn[v]=low[v]=++index;
stack[++top]=v;
instack[v]=true;
for(int i=; i<g[v].size(); i++)
{
int w=g[v][i];
if(!dfn[w])
{
tarjan(w);
low[v]=min(low[v],low[w]);
if(low[w]>=dfn[v])
{
block[]=;
while()
{
block[++block[]]=stack[top];
instack[stack[top]]=;
if(stack[top--]==w)break;
}
block[++block[]]=v;
count_edge();
}
}
else if(instack[w])
low[v]=min(low[v],dfn[w]);
}
} int main ()
{
int n,m,x,y;
while(scanf("%d%d",&n,&m)== && n+m)
{
for(int i=; i<n; i++)g[i].clear();
for(int i=; i<m; i++)
{
scanf("%d%d",&x,&y);
g[x].push_back(y);
g[y].push_back(x);
}
memset(dfn,,sizeof dfn);
memset(low,,sizeof low);
memset(instack,,sizeof instack);
top=index=res1=res2=;
for(int i=; i<n; i++)if(!dfn[i])tarjan(i);
printf("%d %d\n",res1,res2);
}
return ;
}
hdu 3394 Railway的更多相关文章
- HDU 3394 Railway —— (点双联通,记录块信息)
这题是比较模板的找点双联通并记录的题目. 题意大概是:一个公园有n个景点,1.所有游客都是绕环旅游的,找出所有不在环内的路的条数:2.如果两个环中有重复的边,那么这些边是冲突的,问冲突的边的总数. 分 ...
- HDU 3394 双连通分量 桥 Railway
第一个答案是统计图中桥的个数 如果一个点-双连通分量中边的个数大于点的个数那么这个块中所有的边都是冲突的,累加到第二个答案中去. #include <iostream> #include ...
- hdu 3394(点双连通)
题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=3394 思路:题目的意思是要求无向图中的冲突边和不需要边的条数,如果一个块中有多个环,则该块中的每条边都 ...
- Tarjan & LCA 套题题目题解
刷题之前来几套LCA的末班 对于题目 HDU 2586 How far away 2份在线模板第一份倍增,倍增还是比较好理解的 #include <map> #include <se ...
- 备战noip week8
POJ1144 网络 description: 给出一张\(N\)个点的无向图,求其中割点的个数 data range: \(N\le 100\) solution: 一道模板题(但是读入实在是把我恶 ...
- HDU3394 Railway —— 点双联通分量 + 桥(割边)
题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=3394 Railway Time Limit: 2000/1000 MS (Java/Others) ...
- HDU3394:Railway
传送门 点双练习. 对于一张图,询问有多少条边不属于任意一个点双和多少条边至少属于两个点双. 显然,一张图里有多少个桥就是第一问的答案. 对于第二问,考虑对于一个点双,如果其中的边数等于点数,那么这个 ...
- NOIP 考前 Tarjan复习
POJ 1236 给定一个有向图,求: 1) 至少要选几个顶点,才能做到从这些顶点出发,可以到达全部顶点 2) 至少要加多少条边,才能使得从任何一个顶点出发,都能到达全部顶点 第一个就是缩点之后有多少 ...
- Tarjan LCA
强连通 迷宫城堡 Proving Equivalences Equivalent Sets Summer Holiday Intelligence System The King's Problem ...
随机推荐
- Android(java)学习笔记142:使用Sqlite基本流程
- Redis操作字符串工具类封装,Redis工具类封装
Redis操作字符串工具类封装,Redis工具类封装 >>>>>>>>>>>>>>>>>>& ...
- oracle数据库没有监听服务与实例服务(OracleServicesXX)的解决方法
不知道为什么,可能是因为更新系统的原因,过了一段时间,想打开oracle服务,发现居然没有任何oracle有关的服务了,但以前的数据库文件什么的都在,心想肯定是可以复原的,应该只是注册表的问题罢了.在 ...
- 隐藏/显示 我的电脑盘符驱动…
组策略里更改即可:点击"开始"→"运行",输入"gpedit.msc",打开组策略.在窗口左侧的"本地计算机策略"中依次 ...
- EF6调用存储过程,返回多个结果集处理
链接:http://www.codeproject.com/Articles/675933/Returning-Multiple-Result-Sets-from-an-Entity-Fram 案例: ...
- 20151212Jquery 工具函数代码备份
$(function () { /*var str=' jquery '; alert(str); alert($.trim(str));*/ /*var arr=['张三','李四','王五','麻 ...
- MVC Filter自定义验证(拦截)
namespace QS.Web.Extensions { /// <summary> /// 验证session.权限 状态 /// </summary> [Attribut ...
- Solr集群的搭建以及使用(内涵zookeeper集群的搭建指南)
1 什么是SolrCloud SolrCloud(solr 云)是Solr提供的分布式搜索方案,当你需要大规模,容错,分布式索引和检索能力时使用 SolrCloud.当一个系统的索引数据量少的时候 ...
- Activiti安装
1.Activiti下载与简介 1.1 简介 Activiti项目是一项新的基于Apache许可的开源BPM平台,从基础开始构建,旨在提供支持新的BPMN 2.0标准,包括支持对象管理组(OMG), ...
- linux采用模块方法,添加一个新的设备
该文转载自:http://rangercyh.blog.51cto.com/1444712/521244 系统调用是操作系统内核和应用程序之间的接口,而设备驱动程序是操作系统内核和机器硬件之间的接口. ...