思路是因为aoe网的关键路径就是起点到终点的最长路径(起点是入度为0的点,终点是出度为0的点),于是先用spfa求出起点到终点的最长距离,然后再用dfs求起点到终点的最长距离的路径结果保留在ans数组.
#include<stdio.h>
#include<iostream>
#include<queue>
#include<vector>
#include<string.h>
using namespace std;
#define maxn 1005
#define inf 0x3f3f3f3f
struct edge
{
int u,v,w;
}e[10000000];
struct node
{
int v,w;
node(int vv,int ww){v=vv;w=ww;}
};
int vis[maxn],ans[maxn],dis[maxn];//dis数组可以用来dfs剪枝
int n,m,cnt,nowdis;
vector<struct node>g[maxn];
void spfa(int st)
{
queue<int>q;
dis[st]=0;
while(!q.empty()) q.pop();
q.push(st);
vis[st]=1;
while(!q.empty())
{
int t=q.front();
q.pop();
vis[t]=0;
int sz=g[t].size();
for(int i=0;i<sz;i++)
{
int v=g[t][i].v,w=g[t][i].w;
if(dis[v]<(dis[t]+w))
{
dis[v]=dis[t]+w;
if(!vis[v])
{
q.push(v);
vis[v]=1;
}
}
}
}
}
void dfs(int now)
{
if(dis[now]!=nowdis) return ;//因为我们要求的路径的长度是最长的,因为该路径上每一个点到起点的距离都是最长的
if(now==n)
{
for(int i=1;i<=cnt;i++)
cout<<ans[i]<<" ";
cout<<endl;
}
else
{
int sz=g[now].size();
for( int i=0;i<sz;i++)
{
int v,w;
v=g[now][i].v;
w=g[now][i].w;
if(!vis[v])
{
vis[v]=1;
ans[++cnt]=v;
nowdis+=w;
dfs(v);
vis[v]=0;
cnt--;
nowdis-=w;
}
}
}
}
int main()
{
int u,v,w;
cin>>n>>m;
for(int i=1;i<=m;i++)
{
cin>>u>>v>>w;
e[i].u=u;
e[i].v=v;
e[i].w=w;
g[u].push_back(node(v,w));
}
memset(dis,-1,sizeof(dis));
spfa(1);
ans[++cnt]=1;
vis[1]=1;
nowdis=dis[1];
dfs(1);
return 0;
}