//这个题跟个板题差不多,跌死啦算法,暑假第一周学过,当时学的挺明白的,现在就都忘了,又重新看了看网课,不错,稍微看一点就行了,DIj用来计算两个点的最短路径,就是不断找最短的路,然后一次次的更新就行了。哎
怎么都忘了 。。
这个题我弄了个结构体就来存路长和过路费,然后跟板子一样。
还有今天大学的运动会结束了,应该是人生最后一次参加运动会了(尽管这次没有报项目),我觉得应该记录一下,尽管这两天非常无聊,还掉了一小块牙,但这是最后一次,值得写一下。
#include <iostream>
#include <cstring>
#include <cstdio>
#define INF 0x3f3f3f3f
using namespace std;
struct node{
int dst;
int cost;
node():dst(INF),cost(INF) {
}
};
int N,M,S,D;
node mp[510][510];
node dis[510];
int book[510];
void dij(int s,int e){
dis[s].cost=0;
dis[s].dst=0;
int i,j;
for(int i=0;i<N;i++){
int minw=INF;
int minv;
int minc=INF;
for(j=0;j<N;j++){
if(book[j]) continue;
if(dis[j].dst<minw){
minv=j;
minc=dis[j].cost;
minw=dis[j].dst;
}
else if(dis[j].dst==minw){
if(dis[j].cost<minc){
minv=j;
minc=dis[j].cost;
minw=dis[j].dst;
}
}
}
//cout<<minv<<minc<<minw<<endl;
book[minv]=1;
if(minv==e) break;
for(j=0;j<N;j++){
if(book[j] || !mp[minv][j].dst)
continue;
if(dis[j].dst>dis[minv].dst+mp[minv][j].dst){
dis[j].dst=dis[minv].dst+mp[minv][j].dst;
dis[j].cost=dis[minv].cost+mp[minv][j].cost;
}
else if(dis[j].dst==dis[minv].dst+mp[minv][j].dst){
if(dis[j].cost > dis[minv].cost+mp[minv][j].cost){
dis[j].dst=dis[minv].dst+mp[minv][j].dst;
dis[j].cost=dis[minv].cost+mp[minv][j].cost;
}
}
}
}
cout<<dis[e].dst<<" "<<dis[e].cost<<endl;
}
int main(){
int a,b,c,d;
memset(dis,INF,sizeof(dis));
memset(book,0,sizeof(book));
memset(mp,INF,sizeof(mp));
scanf("%d%d%d%d",&N,&M,&S,&D); //S是出发地 D是目的地 N是城市个数 M是公路条数
for(int i=1;i<=M;i++){
cin>>a>>b>>c>>d;
if(c>mp[a][b].dst || d>mp[a][b].cost) continue;
mp[a][b].dst=c;
mp[b][a].dst=c;
mp[a][b].cost=d;
mp[b][a].cost=d;
}
dij(S,D);
return 0;
}