最短路径问题 多加了一个费用 http://acm.hdu.edu.cn/showproblem.php?pid=3790
2014-07-20 14:04
375 查看
#include<iostream> #include<algorithm> #include<cstdio> #define INF 0x3f3f3f using namespace std; const int maxn = 1002; int G[maxn][maxn],pay[maxn][maxn]; int dist[maxn],cost[maxn]; bool vis[maxn]; int n,m; void Prim(int x){ for(int i=1;i<=n;i++){ dist[i]=G[x][i]; cost[i]=pay[x][i]; vis[i]=0; } vis[x]=1; while(1) { vis[0]=1,dist[0]=cost[0]=0; int min2=INF,min1=INF,p; for(int i=1;i<=n;i++){ if(!vis[i]) { if(dist[i]<min2) { min2=dist[i];min1=cost[i];p=i; } else { if(dist[i]==min2&&cost[i]<min1) { min2=dist[i];min1=cost[i];p=i; } } } } if(min2==INF)break; vis[p]=1; for(int i=1;i<=n;i++) if(!vis[i]) { if(dist[i]>G[p][i]+dist[p]) { dist[i]=G[p][i]+dist[p];cost[i]=pay[p][i]+cost[p]; } else { if((dist[i]==G[p][i]+dist[p])&&(cost[i]>pay[p][i]+cost[p])) { dist[i]=G[p][i]+dist[p];cost[i]=pay[p][i]+cost[p]; } } } } } int main(){ while(scanf("%d%d",&n,&m)!=EOF&&(n||m)){ for(int i=1;i<=n;i++){ for(int j=1;j<=n;j++) { G[i][j]=G[j][i]=INF; G[i][i]=0; pay[i][j]=pay[j][i]=INF; pay[i][i]=0; } } for(int i=1;i<=m;i++) { int a,b,v,k; cin>>a>>b>>v>>k; if(G[a][b]>v) { G[a][b]=G[b][a]=v; pay[a][b]=pay[b][a]=k; } else if(G[a][b]==v&&pay[a][b]>k) G[a][b]=G[b][a]=v,pay[a][b]=pay[b][a]=k; } int n1,m1; cin>>n1>>m1; Prim(n1); cout<<dist[m1]<<" "<<cost[m1]<<endl; } return 0; }
相关文章推荐
- http://acm.hdu.edu.cn/showproblem.php?pid=3790&&最短路径问题
- 士兵队列训练问题http://acm.hdu.edu.cn/showproblem.php?pid=1276
- http://acm.hdu.edu.cn/showproblem.php?pid=1203(背包问题)
- 最小路径覆盖&&http://acm.hdu.edu.cn/showproblem.php?pid=4160
- http://acm.hdu.edu.cn/showproblem.php?pid=1166
- 01背包:http://acm.hdu.edu.cn/showproblem.php?pid=2955
- 最大报销额 http://acm.hdu.edu.cn/showproblem.php?pid=1864
- http://acm.hdu.edu.cn/showproblem.php?pid=3519
- http://acm.hdu.edu.cn/showproblem.php?pid=1166 更新节点,区间求和
- http://acm.hdu.edu.cn/showproblem.php?pid=1333
- http://acm.hdu.edu.cn/showproblem.php?pid=1124 N!末尾0的个数
- http://acm.hdu.edu.cn/showproblem.php?pid=1041
- http://acm.hdu.edu.cn/showproblem.php?pid=1540 更新节点,询问节点所在的位置有多少连续的区间
- http://acm.hdu.edu.cn/showproblem.php?pid=1754 更新节点,区间最值
- http://acm.hdu.edu.cn/showproblem.php?pid=1905 素数判断 + 二分
- http://acm.hdu.edu.cn/showproblem.php?pid=2674 (很神奇)
- http://acm.hdu.edu.cn/showproblem.php?pid=1542 矩形面积的并 线段树 + 扫描线 + 离散化
- http://acm.hdu.edu.cn/showproblem.php?pid=2795 更新节点构造线段数很关键,询问特殊
- http://acm.hdu.edu.cn/showproblem.php?pid=3501 欧拉函数
- http://acm.hdu.edu.cn/showproblem.php?pid=1541 结点更新求最左区间的个数