断断续续写了十几题了 还是做个记录吧(没事找事
1030 Travel Plan (30分)
跟1003Emergency差不多 一个加点权一个加边权 在那个基础上改了一点 都是dijkstra 还是挺繁琐 但是能用就行
/*
2020/03/14
PAT A1030 Travel Plan
*/
#include <stdio.h>
#include <algorithm>
#include <stack>
#define INF 9999
using namespace std;
const int maxn=510;
struct Node{
int length=INF;
int cost=INF;
};
int vetnum, sidenum, c1,c2;
Node dist[maxn][maxn];
bool vis[maxn]={false};
int w[maxn]={0};
int d[maxn];
int pr[maxn];
void dij(){
fill(d,d+maxn,INF);
d[c1]=0;
for(int i=0;i<vetnum;i++){
pr[i]=-1;
}
for(int i=0;i<vetnum;i++){
int miin=INF;
int index=-1;
for(int j=0;j<vetnum;j++){
if(!vis[j] && d[j]<miin){
index=j;
miin=d[j];
}
}
if(index==-1)return;
vis[index]=true;
for(int j=0;j<vetnum;j++){
if(vis[j] || dist[index][j].length==INF)continue;
if(dist[index][j].length!=INF && d[j]>d[index]+dist[index][j].length){
d[j]=d[index]+dist[index][j].length;
pr[j]=index;
w[j]=w[index]+dist[index][j].cost;
}
else if(d[j]==d[index]+dist[index][j].length){
if(dist[index][j].cost+w[index]<w[j]){
w[j]=dist[index][j].cost+w[index];
pr[j]=index;
}
}
}
}
}
int main(){
scanf("%d %d %d %d",&vetnum,&sidenum,&c1,&c2);
for(int i=0;i<sidenum;i++){
int stt,ed,length,cost;
scanf("%d %d %d %d",&stt,&ed,&length,&cost);
dist[stt][ed].length=dist[ed][stt].length=length;
dist[stt][ed].cost=dist[ed][stt].cost=cost;
}
dij();
int temp=c2;
stack<int> s;
while(c2!=-1){
s.push(c2);
c2=pr[c2];
}
while(!s.empty()){
printf("%d ",s.top());
s.pop();
}
printf("%d %d",d[temp],w[temp]);
}