当前位置:编程学习 > C/C++ >>

1030. Travel Plan

考察最短路及其路径记录
[cpp]  
#include <algorithm>  
#include <iostream>  
#include <vector>  
#include <stack>  
using namespace std;  
#define  INF 0x6FFFFFFF  
typedef struct Node  
{  
    int dis, cost, path;  
    Node(){dis=INF; cost=INF; path=-1;}  
}Node;  
typedef struct Edge  
{  
    int end, dis, cost;  
    Edge(int e, int d, int c){end = e; dis = d; cost = c;}  
};  
int n, m, s, t;  
vector<vector<Edge>> edge;  
vector<int> path;  
vector<Node> city;  
std::vector<bool> visited;  
  
int FindMin()  
{  
    int mmin = INF;  
    int k = -1;  
    for (int i = 0; i < n; ++i)  
    {  
        if(!visited[i] && city[i].dis < mmin)  
        {  
            mmin = city[i].dis;  
            k = i;  
        }  
    }  
    return k;  
}  
void Dijkstra(int s, int t)  
{  
    visited.assign(n, false);  
    city.clear();  
    city.resize(n);  
    city[s].dis = 0; city[s].cost = 0;  
    while(true)  
    {  
        int u = FindMin();  
        if(u == -1)  
            return;  
        visited[u] = true;  
        for (int i = 0; i < edge[u].size(); ++i)  
        {  
            int v = edge[u][i].end;  
            int cost = edge[u][i].cost;  
            int dis = edge[u][i].dis;  
            if (!visited[v])  
            {  
                if (city[v].dis > city[u].dis+dis)  
                {  
                    city[v].dis = city[u].dis+dis;  
                    city[v].cost = city[u].cost+cost;  
                    city[v].path = u;  
                }  
                else if (city[v].dis == city[u].dis+dis   
                    && city[v].cost > city[u].cost+cost)  
                {  
                    city[v].cost = city[u].cost+cost;  
                    city[v].path = u;  
                }  
            }  
        }  
    }  
      
}  
void OutputPath(int t)  
{  
    stack<int> ans;  
    ans.push(t);  
    while(city[t].path != -1)  
    {  
        t = city[t].path;  
        ans.push(t);  
    }  
    while (!ans.empty())  
    {  
        printf("%d ", ans.top());  
        ans.pop();  
    }  
}  
int main()  
{  
    while (scanf("%d%d%d%d",&n,&m,&s,&t)!=EOF)  
    {  
        edge.clear();  
        edge.resize(n);  
        while (m--)  
        {  
            int u, v, d, c;  
            scanf("%d%d%d%d",&u,&v,&d,&c);  
            edge[u].push_back(Edge(v, d, c));  
            edge[v].push_back(Edge(u, d, c));  
        }  
        //dijkstra  
        Dijkstra(s, t);  
        OutputPath(t);  
        printf("%d %d\n",city[t].dis, city[t].cost);  
    }  
    return 0;  
}  
 
 
补充:软件开发 , C++ ,
CopyRight © 2022 站长资源库 编程知识问答 zzzyk.com All Rights Reserved
部分文章来自网络,