先选长度小的,长度相等,选花费小的,注意细节即可。
传送门:http://acm.hdu.edu.cn/showproblem.php?pid=3790
#include <stdio.h>
#include <string.h>
#include <stdlib.h>
const int MAXN=1010;
const int INF=0x3f3f3f3f;
bool vis[MAXN];
int pre[MAXN];
int cost[MAXN][MAXN];
int money[MAXN][MAXN];
int lowcost[MAXN];
int lowmoney[MAXN];
void Init(){
memset(cost,0x3f,sizeof(cost));
memset(money,0x3f,sizeof(money));
memset(lowcost,0x3f,sizeof(lowcost));
memset(lowmoney,0x3f,sizeof(lowmoney));
memset(vis,0,sizeof(vis));
memset(pre,-1,sizeof(pre));
}
void Dijkstra(int n,int beg){
lowcost[beg] = 0;
lowmoney[beg] = 0;
for(int j=0;j<n;j++){
int k=-1;
int Min=INF;
int Minmoney = INF;
for(int i=0;i<n;i++){
if(!vis[i]&&lowcost[i]<Min){
Min=lowcost[i];
Minmoney = lowmoney[i];
k=i;
}
else if(!vis[i]&&lowcost[i]==Min&&lowmoney[i]<Minmoney){
Minmoney = lowmoney[i];
Min = lowcost[i];
k = i;
}
}
if(k==-1)break;
vis[k]=true;
for(int i=0;i<n;i++){
if(!vis[i]&&lowcost[k]+cost[k][i]<lowcost[i]){
lowcost[i]=lowcost[k]+cost[k][i];
lowmoney[i] = lowmoney[k] + money[k][i];
pre[i]=k;
}
else if(!vis[i]&&lowcost[k]+cost[k][i]==lowcost[i]&&
lowmoney[k] + money[k][i]<lowmoney[i]){
lowcost[i]=lowcost[k]+cost[k][i];
lowmoney[i] = lowmoney[k] + money[k][i];
pre[i]=k;
}
}
}
}
void Input(){
int n,m;
while(scanf("%d %d",&n,&m),n+m){
int tempa,tempb,tempr,tempm;
Init();
for(int i=0;i<m;i++){
scanf("%d %d %d %d",&tempa,&tempb,&tempr,&tempm);
tempa--;tempb--;
if(cost[tempa][tempb]>tempr){
cost[tempa][tempb] = tempr;
cost[tempb][tempa] = tempr;
money[tempa][tempb] = tempm;
money[tempb][tempa] = tempm;
}
else if(cost[tempa][tempb]==tempr&&money[tempa][tempb]>tempm){
money[tempa][tempb] = tempm;
money[tempb][tempa] = tempm;
}
}
int s,t;
scanf("%d %d",&s,&t);
Dijkstra(n,s-1);
printf("%d %d\n",lowcost[t-1],lowmoney[t-1]);
}
}
void File(){
freopen("a.in","r",stdin);
freopen("a.out","w",stdout);
}
int main(void){
// File();
Input();
return 0;
}