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 }
我太难了~给个三连吧,亲~~~