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(){;}
hdu4738

 

posted @ 2017-08-13 21:30  ccc000111  阅读(148)  评论(0编辑  收藏  举报