zoukankan      html  css  js  c++  java
  • 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;
    
    
    }



  • 相关阅读:
    Pandas数据存取
    Pandas统计分析
    (4)awk读取行的细节
    (3)awk命令行结构和语法结构
    安装新版gawk
    (2)BEGIN和END语句块
    (1)AWK快速入门
    shell读取文件的几种方式
    Docker 部署 elk + filebeat
    Linux之关于用户的几个重要配置文件
  • 原文地址:https://www.cnblogs.com/eason9906/p/11755107.html
Copyright © 2011-2022 走看看