最短路

来源:互联网 发布:淘宝客怎么建站2016 编辑:程序博客网 时间:2024/06/05 06:21

例题: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 0x3f3f3f3fusing 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;}


0 0
原创粉丝点击