题意:找出输出的两点间最短路径,当最短路相等时输出最小费用.
解题思路:定义一个结构体,里面定义两个数,一个记录权值,一个记录费用.dis数组是记录当前节点的权值和费用,map就不用说了.在松弛操作里面判断路径是否相等,若相等则判断其费用是否最小.本题还有一个很坑的地方,就是要判重,这个很重要.本题交了3次,第一次为wa,原因是没有判重,第二次是pe,一个很小的错误.


#include <iostream> using namespace std; const int INF=0x7ffffff; const int MAX=1000+10; int used[MAX]; int n; int m; struct node { int i;//记录路径 int j;//记录费用 }; node map[MAX][MAX]; node dis[MAX]; void dijkstra(int start) { memset(used,0,sizeof(used)); for(int i=1;i<=n;i++) { dis[i].i=INF; dis[i].j=INF; } dis[start].i=0; dis[start].j=0; for(i=1;i<=n;i++) { int Min=INF; int index; for(int j=1;j<=n;j++) { if(!used[j]&&dis[j].i<Min) { Min=dis[j].i; index=j; } } used[index]=1; for(j=1;j<=n;j++) { if(!used[j]&&dis[j].i>dis[index].i+map[index][j].i) { dis[j].i=dis[index].i+map[index][j].i; dis[j].j=dis[index].j+map[index][j].j; } else if(!used[j]&&dis[j].i==dis[index].i+map[index][j].i)//当路径相同时其判断其费用,更新一下即可。 { if(dis[j].j>dis[index].j+map[index][j].j) { dis[j].j=dis[index].j+map[index][j].j; } } } } return; } int main() { while(scanf("%d%d",&n,&m),n+m) { for(int i=1;i<=n;i++) { for(int j=1;j<=n;j++) { map[i][j].i=INF; map[i][j].j=INF; } } while(m--) { int a; int b; int value; int value1; scanf("%d%d%d%d",&a,&b,&value,&value1); if(map[a][b].i>value)//判断重边 { map[a][b].i=value; map[b][a].i=value; map[a][b].j=value1; map[b][a].j=value1; } } int a; int b; scanf("%d%d",&a,&b); dijkstra(a); printf("%d %d\n",dis[b].i,dis[b].j); } return 0; }