程序師世界是廣大編程愛好者互助、分享、學習的平台,程序師世界有你更精彩!
首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫知識
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
 程式師世界 >> 編程語言 >> C語言 >> C++ >> C++入門知識 >> 1030. Travel Plan

1030. Travel Plan

編輯:C++入門知識

考察最短路及其路徑記錄 [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;   }      

  1. 上一頁:
  2. 下一頁:
Copyright © 程式師世界 All Rights Reserved