标签:
Time Limit: 2000/1000 MS (Java/Others) Memory Limit: 125536/65536 K (Java/Others)
Total Submission(s): 2563 Accepted Submission(s): 671
1 #include<iostream> 2 #include<cstdio> 3 #include<cstring> 4 #include<algorithm> 5 #include<vector> 6 #include<map> 7 #include<string> 8 using namespace std; 9 const int maxn=100007; 10 struct node 11 { 12 int from,to; 13 }; 14 node edge[100007*2]; 15 int next1[100007*2],first[maxn],pre[maxn],top; 16 int n,m,sum,ans[maxn],anstop; 17 void addedge(int u,int v) 18 { 19 edge[sum].from=u;edge[sum].to=v; 20 next1[sum]=first[u];first[u]=sum;sum++; 21 edge[sum].from=v;edge[sum].to=u; 22 next1[sum]=first[v];first[v]=sum;sum++; 23 } 24 int tarjain(int u,int fa) 25 { 26 int lowu=pre[u]=top++,child=0; 27 for(int i=first[u];i!=-1;i=next1[i]) 28 { 29 int v=edge[i].to; 30 if(!pre[v]){ 31 child++; 32 int lowv=tarjain(v,u); 33 lowu=min(lowv,lowu); 34 if(pre[u]<lowv){ 35 ans[anstop++]=i; 36 } 37 } 38 else if(pre[v]<lowu&&v!=fa){ 39 lowu=min(lowu,pre[v]); 40 } 41 } 42 return lowu; 43 } 44 int main() 45 { 46 ios::sync_with_stdio(false); 47 int t;string s1,s2;int cnt; 48 cin>>t; 49 while(t--){ 50 memset(next1,-1,sizeof(next1)); 51 memset(first,-1,sizeof(first)); 52 memset(pre,0,sizeof(pre)); 53 map<string,int> mp1; 54 map<int,string> mp2; 55 cin>>n>>m; 56 cnt=1;anstop=0,sum=0; 57 for(int i=1;i<=m;i++) 58 { 59 cin>>s1>>s2; 60 if(mp1[s1]==0) mp1[s1]=cnt,mp2[cnt]=s1,cnt++; 61 if(mp1[s2]==0) mp1[s2]=cnt,mp2[cnt]=s2,cnt++; 62 addedge(mp1[s1],mp1[s2]); 63 } 64 top=1; 65 tarjain(1,-1); 66 bool flag=1; 67 for(int i=1;i<=n;i++) 68 { 69 if(!pre[i]) flag=0; 70 } 71 if(!flag){cout<<"0"<<endl;continue;} 72 sort(ans,ans+anstop); 73 cout<<anstop<<endl; 74 int k; 75 for(int i=0;i<anstop;i++) 76 { 77 k=ans[i]; 78 k=min(k,k^1); 79 cout<<mp2[edge[k].from].c_str()<<" "<<mp2[edge[k].to].c_str()<<endl; 80 } 81 } 82 return 0; 83 }
标签:
原文地址:http://www.cnblogs.com/codeyuan/p/4383606.html