| ||||||||||
| Online Judge | Problem Set | Authors | Online Contests | User | ||||||
|---|---|---|---|---|---|---|---|---|---|---|
| Web Board Home Page F.A.Qs Statistical Charts | Current Contest Past Contests Scheduled Contests Award Contest | |||||||||
贴个AC代码最短路路径生成的基础题,直接写出来了一气呵成
#include <stdio.h>
#include <limits.h>
#define MAXN 1001
int G[MAXN][MAXN],vexnum;
void Initial(int N)
{ int i,j;
for(i=0;i<=N;++i)
for(j=0;j<=N;++j)
G[i][j]=INT_MAX;
vexnum=N;
}
int FindMin(int dis[],int visited[])
{ int k=-1,min=INT_MAX,i;
for(i=1;i<=vexnum;++i)
{ if(visited[i]==1) continue;
if(dis[i]<min)
{ k=i;
min=dis[i];
}
}
return k;
}
void Dijkatra(int k,int D)
{ int dis[MAXN],visited[MAXN],i,pre[MAXN];
for(i=1;i<=vexnum;++i)
{ dis[i]=G[k][i],visited[i]=0;
if(dis[i]!=INT_MAX) pre[i]=k;
}
dis[k]=0,visited[k]=1,pre[k]=k;
while(1)
{ k=FindMin(dis,visited);
if(k==-1) break;
visited[k]=1;
for(i=1;i<=vexnum;++i)
{ if(visited[i]==1||G[k][i]==INT_MAX) continue;
if(dis[i]>dis[k]+G[k][i])
{ dis[i]=dis[k]+G[k][i];
pre[i]=k;
}
}
}
if(dis[D]==INT_MAX) puts("-1");
else
{ int res[MAXN],len=0;
k=D;
res[len++]=D;
while(k!=pre[k])
{ res[len++]=pre[k];
k=pre[k];
}
printf("%d\n",len);
for(i=len-1;i>=0;--i)
printf("%d\n",res[i]);
}
}
int main()
{ int N,K;
int a,b;
while(scanf("%d %d",&N,&K)!=EOF)
{ Initial(K);
while(N--)
{ scanf("%d %d",&a,&b);
G[a][b]=1;
}
Dijkatra(1,K);
}
return 0;
}
Followed by: Post your reply here: |
All Rights Reserved 2003-2013 Ying Fuchen,Xu Pengcheng,Xie Di
Any problem, Please Contact Administrator