Description
Input
Output
Sample Input
3 2 1 2 5 6 2 3 4 5 1 3 0 0
Sample Output
9 11
用多一个数组来记录一下花费
#include <iostream>
#include <cstring>
#include <cstdio>
#include <algorithm>
#include <queue>
#include <vector>
#include <iomanip>
#include <math.h>
#include <map>
using namespace std;
#define FIN freopen("input.txt","r",stdin);
#define FOUT freopen("output.txt","w",stdout);
#define INF 0x3f3f3f3f
#define lson l,m,rt<<1
#define rson m+1,r,rt<<1|1
typedef long long LL;
const int MAXN=1000+5;
int Map[MAXN][MAXN];
int dis[MAXN];
int vis[MAXN];
int cost[MAXN][MAXN];
int c[MAXN];
int n,m;
int llss(int s,int e){
for(int i=1;i<=n;i++){
dis[i]=Map[s][i];
c[i]=cost[s][i];
}
memset(vis,0,sizeof(vis));
vis[s]=1;
dis[s]=0;
c[s]=0;
int temp,k;
for(int i=1;i<=n;i++){
if(vis[e]) break;
temp=INF;
for(int j=1;j<=n;j++){
if(!vis[j]&&temp>dis[j]){
k=j;
temp=dis[j];
}
}
if(temp==INF) break;
vis[k]=1;
for(int j=1;j<=n;j++){
if(!vis[j]&&Map[k][j]<INF){
if(dis[j]>dis[k]+Map[k][j]){
dis[j]=dis[k]+Map[k][j];
c[j]=c[k]+cost[k][j];
}
else if(dis[j]==dis[k]+Map[k][j]){
if(c[j]>c[k]+cost[k][j]) c[j]=c[k]+cost[k][j];
}
}
}
}
printf("%d %d\n",dis[e],c[e]);
}
int main()
{
//FIN
int st,ed,len,cos;
int s,e;
while(~scanf("%d%d",&n,&m))
{
if(n==0&&m==0) break;
memset(Map,INF,sizeof(Map));
memset(cost,INF,sizeof(cost));
for(int i=1;i<=n;i++){
Map[i][i]=0;
cost[i][i]=0;
}
for(int i=1;i<=m;i++){
scanf("%d%d%d%d",&st,&ed,&len,&cos);
if(Map[st][ed]>len){
Map[st][ed]=Map[ed][st]=len;
cost[st][ed]=cost[ed][st]=cos;
}
else if(Map[st][ed]==len){
if(cost[st][ed]>cos)
cost[st][ed]=cost[ed][st]=cos;
}
}
scanf("%d%d",&s,&e);
llss(s,e);
}
}
原文:http://www.cnblogs.com/Hyouka/p/5751188.html