HDOJ-3790最短路径问题(Dijkstra)
2015-05-21 21:05
274 查看
多关键字的的最短路问题,把比较部分改一下就好了。
#include<cstdio> #include<cstring> using namespace std; const int inf=0x3F3F3F3; const int N=1100; struct data { int d; int c; }; int vis ; data f ,dist ; int n,m,t,s,d; data add(data x,data y) { data ans; ans.d=x.d+y.d; ans.c=x.c+y.c; return ans; } bool ismin(data x,data y) { if(x.d==y.d) return x.c<y.c; else return x.d<y.d; } /* Dijkstra单源最短路 u为起点,节点编号1~n */ void Dijkstra(int u) { int i,j,pos; data minm; for(i=1;i<=n;i++) { dist[i]=f[u][i]; vis[i]=0; } dist[u].c=0; dist[u].d=0; vis[u]=1; for(i=1;i<=n;i++) { pos=u; minm.d=inf; minm.c=inf; for(j=1;j<=n;j++) if(!vis[j]&&ismin(dist[j],minm)) { pos=j; minm=dist[j]; } vis[pos]=1; for(j=1;j<=n;j++) { if(!vis[j]) if(ismin(add(dist[pos],f[pos][j]),dist[j])) dist[j]=add(dist[pos],f[pos][j]); } } } void work() { int i,j,k,a,b; data l,ans; memset(f,0X3F,sizeof(f)); for(i=1;i<=m;i++) { scanf("%d%d%d%d",&a,&b,&l.d,&l.c); if(ismin(l,f[a][b])) f[a][b]=f[b][a]=l; } scanf("%d%d",&s,&t); Dijkstra(s); printf("%d %d\n",dist[t].d,dist[t].c); } int main() { while(scanf("%d%d",&n,&m),n||m) work(); return 0; }
相关文章推荐
- HDOJ 3790 最短路径问题 (最短路 && Dijkstra && 双权值)
- HDOJ 3790 最短路径问题 【dijkstra】+【双权值】
- HDOJ题目3790最短路径问题(最短路径,Dijkstra双权值)
- HDU 3790 最短路径问题 (dijkstra+路长和权值)
- HDU -- 3790 最短路径问题 (Dijkstra+priority_queue)
- POJ 3790 最短路径问题(Dijkstra变形——最短路径双重最小权值)
- HDOJ 3790-最短路径问题
- HDU 3790 最短路径问题(Dijkstra,要求距离和时间都最短)
- hdoj 3790 最短路径问题(根据两个变量的最短路)
- hdoj 3790 最短路径问题
- hdoj 3790 最短路径问题
- HDU 3790 最短路径问题(Dijkstra)
- HDOJ 3790 最短路径问题
- HDU 3790 最短路径问题(SPFA || Dijkstra )
- HDOJ--3790--最短路径问题(双权值问题)
- hdoj--3790--最短路径问题(双权值迪杰斯特拉)
- HDU 3790 简单最短路径问题(dijkstra+双重权值)
- HDU - 3790 最短路径问题 —— dijkstra
- hdoj 3790 最短路径问题(双重松弛)
- hdoj 3790 最短路径问题