为什么我的输出不对?
一张n个点m条边的有向图,每条边的权值相同.你要找4个点a,b,c,d,使得a->b->c->d的最短路最长(a,b,c,d之间要有路),输出一组解.
原输入:
8 9
1 2
2 3
3 4
4 1
4 5
5 6
6 7
7 8
8 5
原输出:2 1 8 7
我的输出:5 1 8 6
#include<bits/stdc++.h>
using namespace std;
#define N 10100
typedef pair<int,int> P;
struct node
{
int u,v;
}e[N];
vector<P> a[N],b[N];
int n,m,h[N],cnt=0,dis[N][N];
bool cmp(P a,P b)
{
return a.first>b.first;
}
void add(int u,int v)
{
cnt++;
e[cnt].v=v;
e[cnt].u=h[u];
h[u]=cnt;
}
queue<int> q;
void bfs(int x)
{
while(!q.empty())
{
int a=q.front();
q.pop();
for(int i=h[a];i;i=e[i].u)
{
int v=e[i].v;
if(dis[x][a]+1<=dis[x][v])
{
dis[x][v]=dis[x][a]+1;
q.push(v);
}
}
}
}
int main()
{
cin>>n>>m;
for(int i=1;i<=m;i++)
{
int u,v;
cin>>u>>v;
add(u,v);
}
memset(dis,0x3f3f3f3f,sizeof(dis));
for(int i=1;i<=n;i++)
{
dis[i][i]=0;
q.push(i);
bfs(i);
}
for(int i=1;i<=n;i++)
{
for(int j=1;j<=n;j++)
{
if((dis[i][j]==0x3f3f3f3f)||(i==j))
dis[i][j]=-1;
if(dis[i][j]!=-1) a[i].push_back(make_pair(dis[i][j],j));
if(dis[j][i]!=-1) b[i].push_back(make_pair(dis[j][i],j));
}
sort(a[i].begin(),a[i].end(),cmp);
sort(b[i].begin(),b[i].end(),cmp);
}
// for(int i=1;i<=n;i++)
// {
// for(int j=1;j<=n;j++)
// cout<<dis[i][j]<<" ";
// cout<<"\n";
// }
int ans=0,f1,f2,f3,f4;
for(int x2=1;x2<=n;x2++)
{
for(int x3=1;x3<=n;x3++)
{
if(dis[x2][x3]==-1||x2==x3)//||dis[x3][x2])顺序是由2到3
continue;
for(int k1=0;k1<3 && k1<b[x2].size();k1++)
{
int x1=b[x2][k1].second;
if(x1==x2||x1==x3)
continue;
int w1=b[x2][k1].first;
for(int k4=1;k4<3 && k4<a[x3].size();k4++)
{
int x4=a[x3][k4].second;
if(x4==x1||x4==x2||x4==x3)
continue;
int w4=a[x3][k4].first;
if(dis[x2][x3]+w1+w4>ans)
{
f1=x1;f2=x2;f3=x3;f4=x4;
ans=dis[x2][x3]+w1+w4;
}
}
}
}
}
cout<<f1<<" "<<f2<<" "<<f3<<" "<<f4<<"\n";
}