例题:hdu 3790
题目链接
http://acm.hdu.edu.cn/showproblem.php?pid=3790
题意概括
给出一个无向图,图中每个节点的权值有两个,一个是距离,一个是花费,求起点到终点的最短距离及其花费。
解题思路
这个题跟模板题的差距就是多了一个权值,首先需要知道的是,距离的权重比花费重要,所以在最短路的函数里面首先判断的是距离,当距离一样的时候在判断他的花费。最后求出最短距离及其花费。
代码:
#include<stdio.h>
#include<string.h>
#include<ctype.h>
#include<math.h>
#include<algorithm>
#define inf 0x3f3f3f3f
using namespace std;
int n,xx,yy;
int line[1010][1010],vis[1010],dis[1010],pp[1010][1010],disp[1010];
void prime(int x,int y) {
int i,j,minn,k,minnp;
memset(vis,0,sizeof(vis));
for(i=1; i<=n; i++) {
dis[i]=line[x][i];
disp[i]=pp[x][i];
}
vis[x]=1;
for(j=1; j<n; j++) {
minn=inf;
for(i=1; i<=n; i++) {
if(vis[i]==0) {
if(dis[i]<minn) {
minn=dis[i];
minnp=disp[i];
k=i;
} else if(dis[i]==minn&&minn!=inf&&disp[i]<minnp) {
minn=dis[i];
minnp=disp[i];
k=i;
}
}
}
vis[k]=1;
for(i=1; i<=n; i++) {
if(vis[i]==0) {
if(minn+line[k][i]<dis[i]) {
dis[i]=minn+line[k][i];
disp[i]=disp[k]+pp[k][i];
} else if(minn+line[k][i]==dis[i]&&disp[k]+pp[k][i]<disp[i]) {
dis[i]=minn+line[k][i];
disp[i]=disp[k]+pp[k][i];
}
}
}
}
xx=dis[y];
yy=disp[y];
}
int main () {
int i,j,a,b,c,d,m;
while(~scanf("%d %d",&n,&m)) {
if(m==0&&n==0)
break;
memset(line,inf,sizeof(line));
memset(pp,0,sizeof(pp));
while(m--) {
scanf("%d%d%d%d",&a,&b,&c,&d);
if(line[a][b]==0||line[a][b]>c) {
line[a][b]=line[b][a]=c;
pp[a][b]=pp[b][a]=d;
}
}
scanf("%d%d",&a,&b);
prime(a,b);
printf("%d %d
",xx,yy);
}
return 0;
}