PAT A1030 Travel Plan (30分)
题目
题目大意
给出城市之间的连接关系,并给出每条边的权重,计算输出从起点到终点最短路径与最少消费
大体思路
本题是典型的dijkstra+DFS模板题目,掌握了该模板此题没有什么难度
代码
#include<stdio.h>
#include<algorithm>
#include<vector>
using namespace std;
const int maxv=500;
const int INF=100010;
int d[maxv];
int n,m,s,ed;
int G[maxv][maxv],cost[maxv][maxv];//保存城市之间的连接关系与权值
bool vis[maxv]={false};
vector<int> pre[maxv];//保存前驱节点
vector<int> temp,path;//temp表示临时路径,path表示最终路径
int mincost=INF;
//dijkstra模板
void dijkstra(int s){
fill(d,d+maxv,INF);
d[s]=0;
for(int i=0;i<n;i++){
int u=-1,MIN=INF;
for(int j=0;j<n;j++){
if(vis[j]==false&&d[j]<MIN){
u=j;
MIN=d[j];
}
}
if(u==-1)return ;
vis[u]=true;
for(int v=0;v<n;v++){
if(vis[v]==false&&G[u][v]!=INF){
if(d[u]+G[u][v]<d[v]){
d[v]=d[u]+G[u][v];
pre[v].clear();
pre[v].push_back(u);
}else if(d[u]+G[u][v]==d[v]){
pre[v].push_back(u);
}
}
}
}
}
//递归求解模板,同时进行回溯
void DFS(int v,int tempCost){
temp.push_back(v);
if(v==s){
if(tempCost<mincost){
mincost=tempCost;
path=temp;
}
return ;
}
for(int i=0;i<pre[v].size();i++){
DFS(pre[v][i],tempCost+cost[v][pre[v][i]]);
temp.pop_back();
}
}
int main(){
scanf("%d %d %d %d",&n,&m,&s,&ed);
fill(G[0],G[0]+maxv*maxv,INF);
fill(cost[0],cost[0]+maxv*maxv,INF);
for(int i=0;i<m;i++){
int c1,c2,dis,c;
scanf("%d %d %d %d",&c1,&c2,&dis,&c);
G[c1][c2]=G[c2][c1]=dis;
cost[c1][c2]=cost[c2][c1]=c;
}
dijkstra(s);//对起点使用dijkstra算法
DFS(ed,0);//对终点递归求解
for(int i=path.size()-1;i>=0;i--){
printf("%d ",path[i]);
}
printf("%d %d",d[ed],mincost);
return 0;
}