您的位置:首页 > 其它

最短路 Dijkstra算法模板(带路径输出)

2012-07-18 20:19 405 查看
最朴素最短路

适用条件:边权必须为非负;

以HDU2544为例

View Code

#include<stdio.h>
#include<string.h>
#define INF 100000000
#define maxn 1001
bool vis[maxn];
int adj[maxn][maxn],dis[maxn],pre[maxn];//pre[]记录前驱
int n, m;
void dijkstra(int v)
{
int i, j, u , min;
for(i=0;i<=n;i++)
{
dis[i]=adj[v][i];
vis[i]=0;
//if(i!=v&&adj[v][i]!=INF)pre[i] = v;
// else pre[i] = -1;
}
vis[v]=1;dis[v]=0;
for(i=1;i<n;i++)
{
min = INF;
for(j=1;j<=n;j++)
{
if(!vis[j]&&min > dis[j])
{
min = dis[j];
u = j;
}
}
if(min == INF)break;
vis[u]=1;
for(j=1;j<=n;j++)
{
if(!vis[j]&&adj[u][j]!=INF&&dis[u]+adj[u][j]<dis[j])
{
dis[j] = adj[u][j] + dis[u];
//  pre[j] = u;
}
}
}
}
int main()
{
int i, j, x, y, w;
while(~scanf("%d%d",&n,&m)&&n)
{
for(i=0;i<=n;i++)
{
for(j=0;j<=n;j++)
if(i==j)adj[i][j]=0;
else adj[i][j] = INF;
}
while(m--)
{
scanf("%d%d%d",&x,&y,&w);
adj[x][y] = w;
adj[y][x] = w;
}
dijkstra(0);
printf("%d\n",dis
);  //以下为输出路径
/*int p, len=0, ans[maxn];
p = n-1;
while(p!=0)
{
ans[len++] = p;
p = pre[p];

}
printf("0->");
for(i=len-1;i>=0;i--)
printf("%d",ans[i]);
puts("");  */
}
return 0;
}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: