hdoj 3790 最短路径问题(根据两个变量的最短路)
2016-02-04 22:51
363 查看
多加一个判断就好- -
#include <iostream> #include <cstdio> #include <cstring> using namespace std; const int N = 1000 + 10; const int MAX = 0xfffffff; int map , cost ; int min_dist, min_cost; void Dijkstra(int s, int t, int n) { int dist ,cost1 ; bool visit ; int i,j; memset(visit, false, sizeof(visit)); for(int i = 1; i <= N; ++i) { dist[i] = map[s][i]; cost1[i] = cost[s][i]; } dist[s]=0; visit[s]=true; for(i=1;i<n;++i) { int min = MAX; int k; for(j=1;j<=n;++j) { if(!visit[j]&&min>dist[j]) { min=dist[j]; k=j; } } visit[k]=true; for(j=1;j<=n;++j) { if(!visit[j]&&dist[j]>min+map[k][j]) { dist[j]=min+map[k][j]; cost1[j]=cost[k][j]+cost1[k]; } else if(!visit[j]&&dist[j]==min+map[k][j]&&cost1[j]>cost[k][j]+cost1[k]) { cost1[j]=cost[k][j]+cost1[k]; } } if(visit[t]) { min_dist=dist[t]; min_cost=cost1[t]; return ; } } min_dist=dist[t]; min_cost=cost1[t]; } int main() { int n,m,i,j; while(scanf("%d%d",&n,&m)&&(m||n)) { for(i=1;i<=n;++i) for(j=1;j<i;++j) { map[i][j]=map[j][i]=MAX; cost[i][j]=cost[j][i]=MAX; } while(m--) { int a,b,c,d; scanf("%d%d%d%d",&a,&b,&c,&d); if(map[a][b]>c) { map[a][b]=map[b][a] =c; cost[a][b]=cost[b][a]=d; } } int s,t; scanf("%d%d",&s,&t); Dijkstra(s,t,n); printf("%d %d\n",min_dist,min_cost); } return 0; }
相关文章推荐
- Eclipse快捷键大全
- 基本算法——第五单元 递归
- xiraMD2ahcraeS.74
- 执行计划
- Android开发设计模式之——单例模式
- 关于组态王的字符串写入问题:
- 面试笔试杂项积累-leetcode 96-100
- 【poj2478-Farey Sequence】递推求欧拉函数-欧拉函数的几个性质和推论
- js实现对身份证校验
- jjmu2966890f@163.com
- 模板方法模式
- SPFA算法——最短路径
- 学习JavaScript的最佳方法
- 用户创建firefox配置文件
- 第2章练习题9
- 责任链模式
- Odd Even Linked List
- hdu 1035 Robot Motion(模拟)
- 《C程序设计语言》读书笔记第二章
- 基本算法——第四单元 贪心