例题: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\n",xx,yy);
	}
	return 0;
}


 posted on 2017-04-25 19:36  拖延症重症患者~  阅读(108)  评论(0编辑  收藏  举报