zoj 2588 Burning Bridges 割边求解
2015-09-08 19:02
330 查看
[code]#include<bits/stdc++.h> using namespace std; struct Edge { int from,to,tag,id; }; int n,m,dfn[100000+5],low[100000+5],vis[100000+5],dep,b[100000+5],num=0; vector<Edge>edges; vector<int>G[100000+5]; void AddEdge(int from,int to,int id) { int i,flag=0; for(i=0;i<G[from].size();i++) if(edges[G[from][i]].to==to) { edges[G[from][i]].tag++;flag=1;break; } if(!flag) { Edge tp; tp.from=from;tp.to=to;tp.tag=0;tp.id=id; edges.push_back(tp); G[from].push_back(edges.size()-1); } } void dfs(int u,int fa) { dfn[u]=low[u]=++dep; for(int i=0;i<G[u].size();i++) { Edge t=edges[G[u][i]]; if(!vis[t.to]) { vis[t.to]=1; dfs(t.to,u); low[u]=min(low[u],low[t.to]); if(low[t.to]>dfn[u]&&!t.tag) { b[num]=t.id; num++; } } else if(t.to!=fa) low[u]=min(low[u],dfn[t.to]); } } int main() { int _,i,u,v,cas=0; scanf("%d",&_); while(_--) { scanf("%d%d",&n,&m); edges.clear(); for(i=0;i<=n;i++) G[i].clear(); for(i=1;i<=m;i++) { scanf("%d%d",&u,&v); AddEdge(u,v,i); AddEdge(v,u,i); } memset(vis,0,sizeof(vis)); memset(b,0,sizeof(b)); num=0; vis[1]=1; dep=0; dfs(1,-1); printf("%d\n",num); sort(b,b+num); for(i=0;i<num;i++) { if(i) printf(" "); printf("%d",b[i]); } if(num) printf("\n"); if(_) printf("\n"); } return 0; }
相关文章推荐
- Intent七大属性详解
- zoj 2588 Burning Bridges 割边求解
- 两个单向链表,判断它们是否相交,若相交,找出它们的第一个公共的结点
- leecode5 Longest Palindromic Substring
- 奇葩问题汇总
- 16个简单实用的.htaccess技巧
- 文章链接
- Wpf实现钟表效果
- 判断三角形三个点是逆时针还是顺时针
- VBO, VAO, Generic Vertex Attribute
- 15/9/8/BroadcastReceiver实现定时功能/Service
- 博客one day
- 省市联动
- Matlab启动时大量java错误的处理方法
- (转)彻底隐藏Nginx版本号的安全性与方法
- 2014年7月华为校招机试真题1
- 安卓监听滑屏事件
- JBPM 用foreach做动态任务分配,另加驳回操作
- 【iOS】720°全景图 HelloPanorama 介绍以及在使用过程中的一些问题
- Uva1600 - Patrol Robot(bfs解法)