题目描述
给你n个点,m条无向边,每条边都有长度d和花费p,给你起点s终点t,要求输出起点到终点的最短距离及其花费,如果最短距离有多条路线,则输出花费最少的。
输入
输入n,m,点的编号是1~n,然后是m行,每行4个数 a,b,d,p,表示a和b之间有一条边,且其长度为d,花费为p。最后一行是两个数s,t;起点s,终点t。n和m为0时输入结束。
(1<n<=1000, 0<m<100000, s != t)
输出
输出 一行有两个数, 最短距离及其花费。
样例输入
3 2 1 2 5 6 2 3 4 5 1 3 0 0
样例输出
9 11
#include<stdio.h>
#include<algorithm>
#include<vector>
#include<string.h>
#include<iostream>
using namespace std;
const int MAXV=1010;
const int INF=1000000000;
int G[MAXV][MAXV];
bool vis[MAXV]={false};
int pre[MAXV];
int d[MAXV];
int Cost[MAXV][MAXV];
int C[MAXV];
void Dij(int s,int n){
fill(d,d+MAXV,INF);
d[s]=0;
C[s]=0;
// printf("dddd\n");
// vis[s]=true;
for(int i=1;i<=n;i++){
// for(int k=1;k<=n;k++)printf("d[%d]=%d\n",k,d[k]);
int u=-1,MIN;
MIN=INF;
for(int j=1;j<=n;j++){
if(d[j]<MIN&&vis[j]==false){
u=j;
MIN=d[u];
// printf("if:MIN=%d u=%d d[%d]=%d\n",MIN,u,u,d[u]);
}
}
// printf("\n---------------\n");
// printf("\nMIN=%d u=%d d[%d]=%d\n",MIN,u,u,d[u]);
if(u==-1)return;
vis[u]=true;
//for(int j=1;j<=n;j++)pre[j]=j;
for(int j=1;j<=n;j++)
{
if(vis[j]==false&&G[u][j]!=INF)
{
if(d[j]>d[u]+G[u][j]){
d[j]=d[u]+G[u][j];
//printf("%d: d=%d \n",j,d[j]);
// pre[j].push_back(u);
//pre[j]=u;
C[j]=C[u]+Cost[u][j];
}
else if(d[j]==d[u]+G[u][j]&&C[u]+Cost[u][j]<C[j]){
// pre[j].push_back(u);
// pre[j]=u;
C[j]=C[u]+Cost[u][j];
}
}
}
}
}
void DFS(int s,int v){
if(v==s){
printf("%d ",s);
return;
}
DFS(s,pre[v]);
printf("%d ",v);
}
int main(){
int n,s,z,m;
while(scanf("%d %d",&n,&m)!=EOF&!(n==0&&m==0)){
getchar();
fill(d,d+MAXV,INF);
fill(C,C+MAXV,INF);
fill(G[0],G[0]+MAXV*MAXV,INF);
fill(Cost[0],Cost[0]+MAXV*MAXV,INF);
for(int i=1;i<=n;i++){
pre[i]=i;
vis[i]=false;
}
int a,b,w,c;
while(m--){
scanf("%d %d %d %d",&a,&b,&w,&c);
getchar();
if(G[a][b]==INF){
G[a][b]=w;
G[b][a]=w;
Cost[a][b]=c;
Cost[b][a]=c;
}else{
if(G[a][b]>w||Cost[a][b]>c)
{
G[a][b]=w;
G[b][a]=w;
Cost[a][b]=c;
Cost[b][a]=c;
}
}
}
// getchar();
scanf("%d %d",&s,&z);
//getchar();
/* printf("G:\n");
for(int i=1;i<=n;i++)
{
for(int j=1;j<=n;j++)
printf("%d ",G[i][j]);
printf("\n");
}
printf("Cost\n");
for(int i=1;i<=n;i++)
{
for(int j=1;j<=n;j++)
printf("%d ",Cost[i][j]);
printf("\n");
}*/
Dij(s,n);
//printf("ssssss\n");
if(d[z]!=INF){
printf("%d %d\n",d[z],C[z]);
// DFS(s,z);
}
else printf("can't arrive");
//printf("\n");
}
/* cout<<strcmp("a","b")<<endl; -1
cout<<strcmp("b","a")<<endl; 1
cout<<strcmp("123","13")<<endl;-1*/
return 0;
}
注:在上一道题的基础上改一改就好了。