您的位置:首页 > 其它

poj 3463 最短路径+次最短路径+邻接表

2011-09-24 10:52 253 查看
算法:Dijstra算法

题目大意:求出最短路径和次最短路径,如果最短路径+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;
}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: