tarjan算法求割点cojs 8
2016-06-06 22:12
316 查看
tarjan求割点:cojs 8. 备用交换机
★★ 输入文件:gd.in输出文件:
gd.out简单对比
时间限制:1 s 内存限制:128 MB
【问题描述】
n个城市之间有通讯网络,每个城市都有通讯交换机,直接或间接与其它城市连接。因电子设备容易损坏,需给通讯点配备备用交换机。但备用交换机数量有限,不能全部配备,只能给部分重要城市配置。于是规定:如果某个城市由于交换机损坏,不仅本城市通讯中断,还造成其它城市通讯中断,则配备备用交换机。请你根据城市线路情况,计算需配备备用交换机的城市个数,及需配备备用交换机城市的编号。
【输入格式】
输入文件有若干行
第一行,一个整数n,表示共有n个城市(2<=n<=100)
下面有若干行,每行2个数a、b,a、b是城市编号,表示a与b之间有直接通讯线路。
【输出格式】
输出文件有若干行
第一行,1个整数m,表示需m个备用交换机,下面有m行,每行有一个整数,表示需配备交换机的城市编号,输出顺序按编号由小到大。如果没有城市需配备备用交换机则输出0。
【输入输出样例】
输入文件名: gd.in
7
1 2
2 3
2 4
3 4
4 5
4 6
4 7
5 6
6 7
输出文件名:gd.out
2
2
4
#include<iostream> using namespace std; #include<cstdio> #include<cstring> #define N 102 int low ,dfn ,root,topt=0,n,a,b,ans ; bool is_gd ; struct Edge{ int v,last; }edge[N*N*2]; int head ,t=0; void add_edge(int u,int v) { ++t; edge[t].v=v; edge[t].last=head[u]; head[u]=t; } void input() { scanf("%d",&n); while(scanf("%d%d",&a,&b)==2) { add_edge(a,b); add_edge(b,a); } } void tarjan(int k) {/*记住这个模板就好了*/ int cnt=0; dfn[k]=low[k]=++topt; for(int l=head[k];l;l=edge[l].last) { int v=edge[l].v; if(!dfn[v]) { tarjan(v); ++cnt; low[k]=min(low[k],low[v]); if((root==k&&cnt>1)||(root!=k&&low[v]>=dfn[k])) is_gd[k]=true; } else low[k]=min(low[k],dfn[v]); } } int main() { freopen("gd.in","r",stdin); freopen("gd.out","w",stdout); input(); root=1; tarjan(1); for(int i=1;i<=n;++i) if(is_gd[i]) ans[++ans[0]]=i; printf("%d\n",ans[0]); for(int i=1;i<=ans[0];++i) printf("%d\n",ans[i]); fclose(stdin);fclose(stdout); return 0; }
相关文章推荐
- 网页爬虫抓取js动态渲染数据
- 《JavaScript学习笔记》:阻止默认行为
- JavaScript:JSON详解
- 手机开发实战80——Javascript介绍2
- JavaScript:JSON详解
- 手机开发实战79——Javascript介绍1
- CJSON源码研究笔记
- javascript-第五节-字符串、字符数组
- 数据类型,隐式转换以及json,对象,引用类型,预解析 视频教程
- js(javascript)中的奇特for循环写法!
- js点击列表的第一个元素,不起作用,最后一个元素起作用
- 《JavaScript学习笔记》:冒泡及取消冒泡
- js之select二级联动
- js 实现快捷键-event:altKey ctrlKey shiftKey
- 基于jsp的新闻发布系统
- js获取上传文件的url
- 《JavaScript学习笔记》:键盘事件
- 《JavaScript学习笔记》:获取鼠标的位置及应用
- 使用JavaScript实现一个倒数计时程序
- ie 浏览器js关闭窗口弹出警告