zoukankan      html  css  js  c++  java
  • 路径还原(求两个点之间最短距离的路径)

    思路:其实就是加一个pre数组,用来存当前顶点的前一个顶点的值。

    看代码

    #include<iostream>
    #include<cstdio>
    #include<cstring>
    #include<stdio.h>
    #include<string.h>
    #include<cmath>
    #include<math.h>
    #include<algorithm>
    #include<set>
    #include<queue>
    #include<map>
    typedef long long ll;
    using namespace std;
    const ll mod=1e9+7;
    const int maxn=1e3+10;
    const int maxk=100+10;
    const int maxx=1e4+10;
    const ll maxe=1000+10;
    #define INF 0x3f3f3f3f3f3f
    ll v,e;
    ll cost[maxn][maxn];
    ll d[maxn];
    ll pre[maxn];
    bool vis[maxn];
    void solve(int s)
    {
        d[s]=0;
        while(true)
        {
            int flag=-1;
            for(int i=0;i<v;i++)
            {
                if(!vis[i]&&(flag==-1||d[i]<d[flag]))
                    flag=i;
            }
            if(flag==-1)
                break;
            vis[flag]=true;
            for(int i=0;i<v;i++)
            {
                if(d[i]>d[flag]+cost[flag][i])
                {
                    d[i]=d[flag]+cost[flag][i];
                    pre[i]=flag;
                }
            }
        }
    }
    //到顶点t的最短路径
    vector<int> get_path(int t)
    {
        vector<int> path;
        for(;t!=-1;t=pre[t])
        {
            path.push_back(t);
        }
        reverse(path.begin(),path.end());//这样得到的顺序是从t到s的,所以翻转之
        return path;
    }
    int main()
    {
        ios::sync_with_stdio(false);
        cin>>v>>e;
        memset(vis,false,sizeof(vis));
        for(int i=0;i<v;i++)
        {
            for(int j=0;j<v;j++)
                cost[i][j]=INF;
            cost[i][i]=0;
            d[i]=INF;
            pre[i]=-1;
        }
        int a,b,va;
        for(int i=0;i<e;i++)
        {
            cin>>a>>b>>va;
            cost[a][b]=va;
        }
        solve(0);
        vector<int> ans=get_path(v-1);
        /*
        for(int i=0;i<ans.size();i++)//这是另一种输出
        {
            cout<<ans[i]<<" ";
        }
        cout<<endl;*/
        for(vector<int>::iterator i=ans.begin();i!=ans.end();i++)
        {
            cout<<*i;
        }
        return 0;
    }
    当初的梦想实现了吗,事到如今只好放弃吗~
  • 相关阅读:
    线程池略略观
    spring-mvc的工作原理
    openstack cinder-backup流程与源码分析
    为何说只有 1 种实现线程的方法?
    经典排序算法原理解析与优劣对比
    Java中List和ArrayList的区别
    openstack-taskflow 组件记录
    递归:如何利用递归求解汉诺塔问题?
    登录MySQL提示ERROR 1045 (28000)错误解决方法
    回归JavaScript基础(九)
  • 原文地址:https://www.cnblogs.com/caijiaming/p/9382210.html
Copyright © 2011-2022 走看看