hdu4738 Caocao's Bridge Tarjan求割边
填坑……链接:http://acm.hdu.edu.cn/showproblem.php?pid=4738
噫这还是我开博客以来第一次切杭电的题
题意:只有一颗炸弹,要切断这个图,求出这条边权值的最小值。
很裸的$Tarjan$求割边……
但是有几个细节问题:
1、原图可能根本不连通,要输出$0$……
2、原图没有割边,输出$-1$……
3、原图割边权值为$0$,但是考虑到题目背景炸桥还是要派出一个人去炸了它……
1 #include<iostream> 2 #include<cstdio> 3 #include<algorithm> 4 #include<cstring> 5 using namespace std; 6 const int maxn=1005,maxm=1005*1005; 7 struct node 8 { 9 int from,to,dis,next; 10 }edge[maxm<<1]; 11 int head[maxn],tot,n,m; 12 void addedge(int u,int v,int w) 13 { 14 edge[++tot]=(node){u,v,w,head[u]};head[u]=tot; 15 } 16 int num; 17 int low[maxn],dfn[maxn],cnt,minn=2147483647,bridge[maxn]; 18 void tarjan(int root,int id) 19 { 20 low[root]=dfn[root]=++cnt; 21 for(int i=head[root];i;i=edge[i].next) 22 { 23 if(i==(id^1))continue; 24 int v=edge[i].to; 25 if(!dfn[v]) 26 { 27 tarjan(v,i); 28 low[root]=min(low[root],low[v]); 29 if(low[v]>dfn[root]) 30 { 31 bridge[++num]=i; 32 minn=min(minn,edge[i].dis); 33 } 34 } 35 low[root]=min(low[root],dfn[v]); 36 } 37 } 38 int haha() 39 { 40 while(scanf("%d%d",&n,&m)!=EOF&&(n||m)) 41 { 42 memset(head,0,sizeof(head));memset(dfn,0,sizeof(dfn)); 43 memset(low,0,sizeof(low)); 44 tot=1;cnt=num=0;minn=0x3f3f3f3f;int flag=0; 45 for(int i=1;i<=m;i++) 46 { 47 int x,y,z;scanf("%d%d%d",&x,&y,&z); 48 addedge(x,y,z);addedge(y,x,z); 49 } 50 for(int i=1;i<=n;i++) 51 if(!dfn[i]) 52 { 53 flag++; 54 tarjan(i,-1); 55 } 56 if(flag>1)puts("0"); 57 else if(!num)puts("-1"); 58 else if(!minn)puts("1"); 59 else printf("%d\n",minn); 60 } 61 } 62 int sb=haha(); 63 int main(){;}
只要是活着的东西,就算是神我也杀给你看。