炸铁路(弱化版)(最短路过)
spfa版子(tarjan最好,但是洛谷数据......)
1 #include<bits/stdc++.h> 2 using namespace std; 3 int n,m,h[100001],x[10001],k,y[10001],num,vis[100001],ans[100001]; 4 struct p2p{ 5 int a1,a2; 6 }a[200001]; 7 struct pp{ 8 int nxt,dis,to; 9 }e[2000001]; 10 bool cmp(p2p l,p2p r) 11 { 12 if(l.a1==r.a1) 13 return l.a2<r.a2; 14 else 15 return l.a1<r.a1; 16 } 17 void add(int f,int to) 18 { 19 e[++num].nxt=h[f]; 20 e[num].to=to; 21 e[num].dis=1; 22 h[f]=num; 23 } 24 void dfs(int x,int y) 25 { 26 memset(ans,127,sizeof(ans)); 27 memset(vis,0,sizeof(vis)); 28 queue<int>q; 29 q.push(x); 30 ans[x]=0; 31 vis[x]=1; 32 while(!q.empty()) 33 { 34 int w=q.front(); 35 q.pop(); 36 vis[w]=0; 37 for(int i=h[w];i;i=e[i].nxt) 38 { 39 if(e[i].to==y&&w==x) 40 continue; 41 if(ans[e[i].to]>ans[w]+e[i].dis) 42 { 43 ans[e[i].to]=ans[w]+e[i].dis; 44 if(vis[e[i].to]==0) 45 { 46 vis[e[i].to]=1; 47 q.push(e[i].to); 48 } 49 } 50 } 51 } 52 } 53 int main() 54 { 55 cin>>n>>m; 56 for(int i=1;i<=m;i++) 57 { 58 cin>>x[i]>>y[i]; 59 add(x[i],y[i]); 60 add(y[i],x[i]); 61 } 62 for(int i=1;i<=m;i++) 63 { 64 dfs(x[i],y[i]); 65 if(ans[y[i]]>100000000) 66 { 67 k++; 68 a[k].a1=min(x[i],y[i]); 69 a[k].a2=max(y[i],x[i]); 70 } 71 } 72 sort(a+1,a+1+k,cmp); 73 for(int i=1;i<=k;i++) 74 cout<<a[i].a1<<" "<<a[i].a2<<endl; 75 }