邻接表+SPFA+sort排序==AC
在模板的基础上增加一行代码(我称之为画龙点睛!):
关键
if(e[i].to==y&&w==x) continue;
okk,上ACcode:
#include<bits/stdc++.h>
using namespace std;
int n,m,h[100001],x[10001],k,y[10001],num,vis[100001],ans[100001];
struct p2p{
int a1,a2;
}a[200001];
struct pp{
int nxt,dis,to;
}e[2000001];
bool cmp(p2p l,p2p r)
{
if(l.a1==r.a1)
return l.a2<r.a2;
else
return l.a1<r.a1;
}
void add(int f,int to)
{
e[++num].nxt=h[f];
e[num].to=to;
e[num].dis=1;
h[f]=num;
}//邻接表
void dfs(int x,int y)
{
memset(ans,127,sizeof(ans));
memset(vis,0,sizeof(vis));
queue<int>q;
q.push(x);
ans[x]=0;
vis[x]=1;
while(!q.empty())
{
int w=q.front();
q.pop();
vis[w]=0;
for(int i=h[w];i;i=e[i].nxt)
{
if(e[i].to==y&&w==x)
continue;
if(ans[e[i].to]>ans[w]+e[i].dis)
{
ans[e[i].to]=ans[w]+e[i].dis;
if(vis[e[i].to]==0)
{
vis[e[i].to]=1;
q.push(e[i].to);
}
}
}
}//SPFA
}
int main()
{
cin>>n>>m;
for(int i=1;i<=m;i++)
{
cin>>x[i]>>y[i];
add(x[i],y[i]);
add(y[i],x[i]);
}
for(int i=1;i<=m;i++)
{
dfs(x[i],y[i]);
if(ans[y[i]]>100000000)
{
k++;
a[k].a1=min(x[i],y[i]);
a[k].a2=max(y[i],x[i]);
}
}//枚举
sort(a+1,a+1+k,cmp);//排序
for(int i=1;i<=k;i++)
cout<<a[i].a1<<" "<<a[i].a2<<"\n";
return 0;
}
over~