AOE网打印所有的关键路径

思路是因为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;


}



原文地址:https://www.cnblogs.com/eason9906/p/11755107.html