HDU3790 最短路径问题
2012-12-02 12:09
411 查看
#include<stdio.h> #include<string.h> #define MAX 0x7ffffff struct G { int d; int p; }map[1001][1001]; struct D { int d; int p; }dist[1001]; bool vis[1001]; int m,n,s,e; void dijkstra() { int i,j,k,min; for(i=1;i<n;i++){ for(min=MAX,j=1;j<=n;j++){ if(!vis[j]&&min>dist[j].d){ min=dist[j].d; k=j; } } vis[k]=1; for(j=1;j<=n;j++){ if(!vis[j]){ if(dist[j].d>dist[k].d+map[k][j].d){ dist[j].d=dist[k].d+map[k][j].d; dist[j].p=dist[k].p+map[k][j].p; }else if(dist[j].d==dist[k].d+map[k][j].d&&dist[j].p>dist[k].p+map[k][j].p){ dist[j].p=dist[k].p+map[k][j].p; } } } } printf("%d %d\n",dist[e].d,dist[e].p); } void init() { int i,j; int a,b,d,p; for(i=1;i<=n;i++){ for(j=1;j<=n;j++){ map[i][j].d=map[j][i].d=MAX; map[i][j].p=map[j][i].p=MAX; } map[i][i].d=map[i][i].p=0; } for(i=0;i<m;i++) { scanf("%d%d%d%d",&a,&b,&d,&p); if(map[a][b].d>d){ map[a][b].d=map[b][a].d=d; map[a][b].p=map[b][a].p=p; }else if(map[a][b].d==d&&map[a][b].p>p){ map[a][b].p=map[b][a].p=p; } } scanf("%d%d",&s,&e); for(i=1;i<=n;i++){ dist[i].d=map[s][i].d; dist[i].p=map[s][i].p; } memset(vis,0,sizeof(vis)); vis[s]=1; dist[s].d=dist[s].p=0; } int main() { while(scanf("%d%d",&n,&m),n||m){ init(); dijkstra(); } return 0; }
我用dijkstra做的,还可以用其他方法去做!如:SPFA
相关文章推荐
- hdu3790 最短路径问题
- hdu3790最短路径问题 (用优先队列实现的)
- HDU3790 最短路径问题(双重权值+spfa)
- hdu3790最短路径问题
- hdu3790 最短路径问题
- hdu3790 最短路径问题 (dijkstra,双关键值最短路)
- HDU3790 最短路径问题【Dijsktra算法】
- hdu3790 最短路径问题--单源最短路径
- HDU3790-最短路径问题(dijkstra算法)
- hdu3790最短路径问题
- hdu3790(最短路径问题)
- hdu3790最短路径问题Dijkstra(迪杰斯特拉)
- (hdu3790)最短路径问题(dijkstra算法)
- hdu3790 最短路径问题
- hdu3790 最短路径问题(Dijkstra)
- 【迪杰斯特拉双关键字最短路】【HDU3790】【最短路径问题】
- 【练习赛补题】问题 D: 最短路径问题 hdu3790【dfs】
- HDU3790 最短路径问题
- 【迪杰斯特拉双关键字最短路】【HDU3790】【最短路径问题】
- hdu3790 最短路径问题<最短路>