poj 3463 最短路径+次最短路径+邻接表
2011-09-24 10:52
253 查看
算法:Dijstra算法
题目大意:求出最短路径和次最短路径,如果最短路径+1==次最短路径,则输出最短路径条数+次最短路径条数,否则输出最短路径条数。
用邻接表做,不用邻接矩阵,因为有重边。我开是用邻接矩阵做的,算法没问题,卡了半天,计算条数的时候会少。
View Code
题目大意:求出最短路径和次最短路径,如果最短路径+1==次最短路径,则输出最短路径条数+次最短路径条数,否则输出最短路径条数。
用邻接表做,不用邻接矩阵,因为有重边。我开是用邻接矩阵做的,算法没问题,卡了半天,计算条数的时候会少。
View Code
#include <stdio.h> #include <string.h> const int INF = 1 << 30; int dis[1005][2],v[1005][2],dp[1005][2],box[1005]; struct node { int u,val,next; }Edge[10005]; int n,m,S,T; int Dijstra(int S,int T) { int i,j; memset(v,0,sizeof(v)); memset(dp,0,sizeof(dp)); for(i = 1;i <= n;i ++) dis[i][0] = dis[i][1] = INF; dis[S][0] = 0; dp[S][0] = 1; int x,flag; for(i = 1;i <= n*2;i ++) { int min_d = INF; for(j = 1;j <= n;j ++) { if(!v[j][0] && min_d > dis[j][0]) { min_d = dis[j][0]; x = j; flag = 0; } else if(!v[j][1] && min_d > dis[j][1]) { min_d = dis[j][1]; x = j; flag = 1; } } v[x][flag] = 1; if(min_d == INF) break; for(j = box[x];j != -1;j = Edge[j].next) { int len = min_d + Edge[j].val,y = Edge[j].u; if(len < dis[y][0]) { dis[y][1] = dis[y][0]; dp[y][1] = dp[y][0]; dis[y][0] = len; dp[y][0] = dp[x][flag]; } else if(len == dis[y][0]) { dp[y][0] += dp[x][flag]; } else if(len < dis[y][1]) { dis[y][1] = len; dp[y][1] = dp[x][flag]; } else if(len == dis[y][1]) { dp[y][1] += dp[x][flag]; } } } int ans; if(dis[T][0] + 1 == dis[T][1]) ans = dp[T][0] + dp[T][1]; else ans = dp[T][0]; return ans; } int main() { int i,j; int ca; scanf("%d",&ca); while(ca --) { scanf("%d %d",&n,&m); memset(box,-1,sizeof(box)); for(i = 1;i <= m;i ++) { int a,b,c; scanf("%d %d %d",&a,&b,&c); Edge[i].u = b; Edge[i].val = c; Edge[i].next = box[a]; box[a] = i; } scanf("%d %d",&S,&T); printf("%d\n",Dijstra(S,T)); } return 0; }
相关文章推荐
- 最短路径与次短路径的条数 POJ 3463
- poj 3463 计算最短与次短路径数
- poj 3463 Sightseeing 最短路径数量
- Poj 1860 Currency Exchange(Bellman-Ford,SPFA解单源最短路径问题)
- poj2449 第k短路 (单源最短路径+A*)
- poj 1273 Drainage Ditches(最大费用流+最短增广路径算法)
- POJ 2139 floyd最短路径
- 图之Dijkstra算法(邻接表)---最短路径
- poj 2240 Arbitrage(最短路径)
- 初级->图算法->最短路径 poj 1860 Currency Exchange
- POJ 3278 爬格子 (bfs求最短路径)
- 2011.11.10 poj1062,poj2253,poj1125 单源最短路径 解题报告
- POJ 1847 Tram(Dijkstra单源有向图最短路径算法)
- 用邻接表实现图的深度优先遍历、广度优先遍历、最短路径(无权图)
- POJ 1125:Stockbroker Grapevine:多源最短路径forld
- POJ 3790 最短路径问题(Dijkstra变形——最短路径双重最小权值)
- POJ-2387 Til the Cows Come Home(Dijsktra算法求最短路径)
- POJ 1125 Stockbroker Grapevine(求最短路径—Floyd算法)
- POJ 1847 Tram (简单最短路径dijkstra-floyd-spfa)
- POJ 3169 Layout ( 最短路径、差分约束)