UVA-796 Critical Links 找桥

UVA - 796  Critical Links

题意:找出所有的桥,按序号的字典序输出。

就直接套模板,一开始觉得应该没有重边,而且因为这蛋疼的输入方式,重边不太好处理,但事实用几发大红wrong啪啪打脸,是真的疼

所以还是存在重边的,加个map哈希一下对重边的建边判断一下。

 1 #include<cstdio>
 2 #include<vector>
 3 #include<map>
 4 #include<algorithm>
 5 using namespace std;
 6 const int N=1e4+11;
 7 struct Side{
 8     int id,v,ne;
 9     Side(){}
10     Side(int v,int ne):v(v),ne(ne){}
11     bool operator<(const Side &s1)const{
12         return v==s1.v ? ne<s1.ne : v<s1.v;
13     }
14 }S[N<<1];
15 vector<Side> vv;
16 map<int,bool> mmp; 
17 int n,sn,dn,head[N],dfn[N],low[N],fp[N];
18 void init(){
19     sn=dn=0;
20     vv.clear();
21     mmp.clear();
22     for(int i=0;i<=n;i++){
23         dfn[i]=0;
24         fp[i]=head[i]=-1;
25     }
26 }
27 void add(int u,int v,int id){
28     S[sn].id=id;
29     S[sn].v=v;
30     S[sn].ne=head[u];
31     head[u]=sn++;
32 }
33 void findq(int u,int fa){
34     dfn[u]=low[u]=++dn;
35     int v,id;
36     for(int i=head[u];~i;i=S[i].ne){
37         v=S[i].v;id=S[i].id;
38         if(!dfn[v]){
39             fp[v]=id;
40             findq(v,u);
41             low[u]=min(low[u],low[v]);
42         }else if(id!=fp[u]) low[u]=min(low[u],dfn[v]);
43     }
44     if(fp[u]!=-1&&dfn[u]==low[u]){
45         if(fa<u) vv.push_back(Side(fa,u));
46         else  vv.push_back(Side(u,fa));
47     }
48 }
49 int main(){
50     int u,m,v,cnt;
51     while(~scanf("%d",&n)){
52         init();cnt=0;
53         for(int i=0;i<n;i++){
54             scanf("%d (%d)",&u,&m);
55             while(m--){
56                 scanf("%d",&v);
57                 if(!mmp.count(u*N+v)){
58                     mmp[v*N+u]=true;
59                     add(u,v,cnt);
60                     add(v,u,cnt);
61                     cnt++;
62                 }
63             }
64         }
65         for(int i=0;i<n;i++) if(!dfn[i]) findq(i,i);
66         printf("%d critical links\n",(int)vv.size());
67         sort(vv.begin(),vv.end());
68         for(int i=0;i<(int)vv.size();i++) printf("%d - %d\n",vv[i].v,vv[i].ne);
69         printf("\n");
70     }
71     return 0;
72 }
脸肿

 

posted @ 2019-10-09 21:42  新之守护者  阅读(121)  评论(0编辑  收藏  举报