给你n个点,m条无向边,每条边都有长度d和花费p,给你起点s终点t,要求输出起点到终点的最短距离及其花费,如果最短距离有多条路线,则输出花费最少的。
Input
输入n,m,点的编号是1~n,然后是m行,每行4个数 a,b,d,p,表示a和b之间有一条边,且其长度为d,花费为p。最后一行是两个数 s,t;起点s,终点。n和m为0时输入结束。
(1<n<=1000, 0<m<100000, s != t)
Output
输出 一行有两个数, 最短距离及其花费。
Sample Input
3 2
1 2 5 6
2 3 4 5
1 3
0 0
Sample Output
9 11
AC代码:
#include<iostream>
#include<string.h>
#include<algorithm>
#include<limits.h>
#define M 99999999
#define N 1005
#define FOR(i,s,t) for(int i=(s);i<=t;++i)
using namespace std;
int dist[N];
int pas[N];
int map[N][N];
int pay[N][N];
bool visit[N];
int n,m,p,q;
void Dijstra()
{ int now=p;
dist[now]=0;
pas[now]=0;
visit[now]=false;
FOR(i,1,n)
{ FOR(j,1,n)
if(visit[j])
{
if(dist[j]>dist[now]+map[now][j])
{dist[j]=dist[now]+map[now][j];
pas[j]=pas[now]+pay[now][j];
}
else if(dist[j]==dist[now]+map[now][j]&&pas[j]>pas[now]+pay[now][j])
pas[j]=pas[now]+pay[now][j];
}
int minx=M;
FOR(j,1,n)
if(visit[j]&&dist[j]<minx)
minx=dist[now=j];
visit[now]=false;
}
cout<<dist[q]<<" "<<pas[q]<<endl;
}
int main()
{ while(cin>>n>>m&&n&&m)
{ FOR(i,1,n)
FOR(j,1,n)
{ dist[i]=M;
map[i][j]=M;
visit[i]=true;
pas[i]=M;
pay[i][j]=M;
}
FOR(i,1,m)
{ int a,b,c,d;
cin>>a>>b>>c>>d;
if(map[a][b]>c)
{map[a][b]=map[b][a]=c;
pay[a][b]=pay[b][a]=d;
}
}
cin>>p>>q;
Dijstra();
} return 0;
}