炸铁路(弱化版)(最短路过)

题面

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 }

 

posted @ 2019-07-10 11:41  [jackeylove]  阅读(151)  评论(0编辑  收藏  举报