解题思路:采用dijkstra算法
#include <stdio.h> #include <malloc.h> #define ERROR -1 #define MaxVex 500+1 #include <string.h> #define INF 0x3f3f3f3f int Map[MaxVex][MaxVex]; int cost[MaxVex][MaxVex]; int Nv,Ne; int visit[MaxVex]= {0}; int dist[MaxVex]; int Mcost[MaxVex]; void Init() { memset(Map,INF,sizeof(Map)); memset(cost,0,sizeof(cost)); int i; int v1,v2,p,c; for(i=0; i<Ne; i++) { scanf("%d %d %d %d",&v1,&v2,&p,&c); Map[v1][v2]=p; Map[v2][v1]=Map[v1][v2]; cost[v1][v2]=c; cost[v2][v1]=cost[v1][v2]; } } void ShortPath(int s,int d) { visit[s]=1; int i,j,w; for(j=0; j<Nv; j++) { int MIN=INF; for(i=0; i<=d; i++) { if(!visit[i]) { if(dist[i]<MIN) { MIN=dist[i]; w=i; } } } visit[w]=1; for(i=0; i<=d; i++) { if(!visit[i]) { if(MIN+Map[w][i]<dist[i]) { dist[i]=MIN+Map[w][i]; Mcost[i]=Mcost[w]+cost[w][i]; } else if(MIN+Map[w][i]==dist[i]) { if(Mcost[i]>Mcost[w]+cost[w][i]) { Mcost[i]=Mcost[w]+cost[w][i]; } } } } } } int main() { int s,d; scanf("%d %d %d %d",&Nv,&Ne,&s,&d); int i; for(i=0; i<Nv; i++) { visit[i]=0; } Init(); for(i=0; i<Nv; i++) { dist[i]=Map[s][i]; Mcost[i]=cost[s][i]; } ShortPath(s,d); printf("%d %d",dist[d],Mcost[d]); return 0; }