ZJU 2588 Burning Bridges - 无向图的桥
来源:互联网 发布:c语言ascii码对照表 编辑:程序博客网 时间:2024/06/05 08:55
题目大意:
给出一个无向图,N个顶点M条边(N<10 000,M<100 000)。求出图中桥的个数及编号。注意,可能出现重边。
分析:
题目就是要求无向图的桥。至于重边的处理,只要顶点ij之间有重边,那么这些重边任何一条都不可能是桥。
由于数据量大,需要用邻接表来存无向图。
PE了无数次>_<,输出时每两个桥的编号之间有一个空格,行尾无空格;没两组测试数据之间有空行,末尾无空行;如果该组测试数据没有桥,第二行的空行不要输出。
- /*
- ZJU2588 Burning Bridges
- */
- #include <stdio.h>
- #include <memory.h>
- #define clr(a) memset(a,0,sizeof(a))
- #define N 10005
- #define M 100005
- #define MIN(a,b) ((a)>(b)?(b):(a))
- /*******************************************/
- typedef struct NodeStr{
- int j,tag,id; struct NodeStr *next;
- }Node;
- Node mem[M*2];
- int memp,nid;
- int bridge[M]; //i->j,is bridge
- int nbridge;
- int addEdge(Node *e[],int i,int j){
- Node* p;
- for(p=e[i];p!=NULL;p=p->next) if(p->j==j) break;
- if(p!=NULL){ p->tag++; return 0; }
- p=&mem[memp++];
- p->j=j; p->next=e[i]; e[i]=p; p->id=nid; p->tag=0;
- return 1;
- }
- int anc[N],mark[N],deep[N]; //i可达祖先的最小编号;0,1,2访问标记;DFS深度
- int DFS(Node *e[],int i,int father,int dth,int cut[]){
- int j,k,sons=0,count=0; Node *p,*q;
- mark[i]=1; deep[i]=anc[i]=dth;
- for(p=e[i];p!=NULL;p=p->next){
- j=p->j;
- if(j!=father && mark[j]==1) anc[i]=MIN(anc[i],deep[j]);
- if(mark[j]==0){
- count+=DFS(e,j,i,dth+1,cut);
- sons++;
- anc[i]=MIN(anc[i],anc[j]);
- if((father==-1&&sons>1)||(father!=-1&&anc[j]>=deep[i])) cut[i]=1;
- //if(anc[j]>deep[i]) brige[i][j]=1; //边(i,j)是桥
- if(anc[j]>deep[i] && !p->tag) bridge[p->id]=++nbridge;
- }
- }
- mark[i]=2;
- return count+cut[i];
- }
- int Cutpoints_Link(Node *e[],int n,int cut[]){
- int i,j,count=0;
- for(i=0;i<n;i++) cut[i]=0;
- memset(mark,0,sizeof(mark));
- for(i=0;i<n;i++)if(mark[i]==0) count+=DFS(e,0,-1,0,cut);
- return count;
- }
- /***************************************/
- int n,m;
- Node *e[N];
- int cut[N];
- int main()
- {
- int i,j,k,n,m,T;
- scanf("%d",&T);
- while(T--){
- //init
- memp=0; nid=0; clr(e);
- //input
- scanf("%d%d",&n,&m);
- for(k=0;k<m;k++,nid++){
- scanf("%d%d",&i,&j);
- addEdge(e,i-1,j-1); addEdge(e,j-1,i-1);
- bridge[nid]=0;
- }
- //bridge
- nbridge=0; clr(bridge);
- Cutpoints_Link(e,n,cut);
- //output
- printf("%d/n",nbridge);
- for(i=0,k=nbridge;i<m;i++){
- if(bridge[i]){
- printf("%d",i+1);
- if(--k) printf(" ");
- }
- }
- if(nbridge )puts("");
- if(T) puts("");
- }
- return 0;
- }
- ZJU 2588 Burning Bridges - 无向图的桥
- ZOJ 2588 Burning Bridges 求无向图的桥
- zoj2588 Burning Bridges(无向图的桥)
- ZOJ 2588 Burning Bridges(无向图求割边,桥)
- zoj Burning Bridges 无向连通图 求割点 桥 tarjan
- ZOJ 2588 Burning Bridges(求含重边的无向连通图的割边) - from lanshui_Yang
- zoj 2588 Burning Bridges【无向图求桥 并输出桥对应边的序号】
- ZOJ 2588--Burning Bridges【无向图边双联通 && 输出桥的编号】
- ZOJ 2588 Burning Bridges 求无向图桥 边双连通裸题
- ZOJ 2588 Burning Bridges(无向连通图求割边)
- ZOJ 2588 Burning Bridges(无向图求割边)
- ZOJ 2588 : Burning Bridges - 无向图求割边(裸)
- 无向图边连通性 ZOJ2588 Burning Bridges
- zoj Burning Bridges(无向图割边)
- 【连通图|桥】ZOJ-2588 Burning Bridges
- [桥]zoj 2588 Burning Bridges
- zoj 2588 Burning Bridges 桥
- 【ZOJ-2588】Burning Bridges【桥】
- 今天感受了分页载入 很Cool
- 形形色色的定位方式及服务
- 如何在网页里改变鼠标
- RILNotifyCallBack中的通知消息类型
- 在winXP sp2 系统下安装SQLSERVER2000企业版
- ZJU 2588 Burning Bridges - 无向图的桥
- GTK QT GNOME KDE的关系
- GPRS流量计算方法(TCP/IP)
- 导出excel时设置单元格格式(避免类似0100的数字丢失前面的0)
- CentOS调整防火墙设置
- web页面左右框选择的实现与优化过程
- PowerCHM-强大的CHM工具
- Java与XML联合编程之SAX篇
- FreeBSD系统下su:sorry的解决办法