1030. Travel Plan (30)

来源:互联网 发布:windows toolkit 编辑:程序博客网 时间:2024/06/06 22:34

Dijkstra

#include<iostream>#include<vector>#include<algorithm>using namespace std;const int INF = 99999999;const int MAX = 1000;int d[MAX],G[MAX][MAX],C[MAX][MAX],cost[MAX],pre[MAX];bool visited[MAX]={false};int n,m,s,e;void dijkstra(int s){fill(d,d+MAX,INF);fill(cost,cost+MAX,INF);d[s]=0,cost[s]=0;for(int i=0;i<n;i++) pre[i]=i; for(int i=0;i<n;i++){int u=-1,mind=INF;for(int j=0;j<n;j++){if(visited[j]==false&&d[j]<mind){mind=d[j];u=j;}}if(u==-1) return;visited[u]=true;for(int v=0;v<n;v++){if(visited[v]==false&&G[u][v]!=INF){if(d[u]+G[u][v]<d[v]){d[v]=d[u]+G[u][v];cost[v]=cost[u]+C[u][v];pre[v]=u;}else if(d[u]+G[u][v]==d[v]&&cost[u]+C[u][v]<cost[v]){cost[v]=cost[u]+C[u][v];pre[v]=u;}}}}} vector<int> path;void DFS(int end){if(end==s){path.push_back(end);return ;}DFS(pre[end]);path.push_back(end);} int main(){fill(G[0],G[0]+MAX*MAX,INF);fill(C[0],C[0]+MAX*MAX,INF);scanf("%d%d%d%d",&n,&m,&s,&e);for(int i=0;i<m;i++){int x,y,length,fee;scanf("%d%d%d%d",&x,&y,&length,&fee);G[x][y]=G[y][x]=length;C[x][y]=C[y][x]=fee;}dijkstra(s);DFS(e);for(int i=0;i<path.size();i++){if(i!=0) printf(" ");printf("%d",path[i]);}printf(" %d %d",d[e],cost[e]);return 0;}


0 0
原创粉丝点击