当前位置: 代码迷 >> 综合 >> PAT甲级题目1030 Travel Plan
  详细解决方案

PAT甲级题目1030 Travel Plan

热度:26   发布时间:2024-01-30 07:53:30.0

代码:

#include<bits/stdc++.h>
using namespace std;
int Cost[505][505],Dis[505][505];//存储每条边的权重、距离
int dis[505],cost[505],pathLast[505];//存储起点到该点的最短距离、起点到该点的最小权重、路径
bool visit[505];//存储起点到该点是否已被访问
int N,M,S,D;
void Dijkstra(){while(!visit[D]){//如果终点还没有被访问到int v=-1,MIN=INT_MAX;//在当前未访问的结点中找到距离最小的结点for(int i=0;i<N;++i)if(!visit[i]&&dis[i]<MIN){MIN=dis[i];v=i;}if(v==-1) return;//该图不是连通图,直接返回visit[v]=true;//置该点已被访问for(int i=0;i<N;++i)//遍历该点能够到达的结点并更新相关信息if(!visit[i]&&Dis[v][i]!=0&&dis[i]>dis[v]+Dis[v][i]){dis[i]=dis[v]+Dis[v][i];cost[i]=cost[v]+Cost[v][i];pathLast[i]=v;}else if(Dis[v][i]!=0&&dis[i]==dis[v]+Dis[v][i]&&cost[i]>cost[v]+Cost[v][i]){cost[i]=cost[v]+Cost[v][i];pathLast[i]=v;}}
}
void DFS(int v){//深度优先遍历输出最短路径if(v==S)printf("%d",v);else{DFS(pathLast[v]);printf(" %d",v);}
}
int main(){scanf("%d%d%d%d",&N,&M,&S,&D);for(int i=0;i<M;++i){int a,b,c,d;scanf("%d%d%d%d",&a,&b,&c,&d);Dis[a][b]=Dis[b][a]=c;Cost[a][b]=Cost[b][a]=d;}fill(dis,dis+N,INT_MAX);fill(cost,cost+N,INT_MAX);dis[S]=cost[S]=0;Dijkstra();DFS(D);printf(" %d %d",dis[D],cost[D]);return 0;
}