HDOJ2544

来源:互联网 发布:卖耐克阿迪折扣店淘宝 编辑:程序博客网 时间:2024/05/02 01:20

裸的最短路,起点固定为1,终点固定为N。感觉只是prim算法的小改。


#include <stdio.h>
#include <string.h>
int n,m,map[1005][1005],d[1005],vis[1005];
int a,b,c,pos,min;
void init()
{
    for(int i=1;i<=n;i++)
    {
        for(int k=1;k<=n;k++)
        {
            map[i][k]=100000000;
        }
    }
    memset(vis,0,sizeof(vis));
}
void Dijkstra(int start)
{
    vis[start]=1;
    for(int i=1;i<=n;i++)
    {
        if (!vis[i])
        d[i]=map[start][i];
    }
    for(int i=1;i<n;i++)
    {
        min=100000000;
        for(int k=1;k<=n;k++)
        {
            if (!vis[k]&&d[k]<min)
            {
                min=d[k];
                pos=k;
            }
        }
        vis[pos]=1;
        for(int i=1;i<=n;i++)
        {
            if (!vis[i]&&d[i]>map[pos][i]+d[pos])
                d[i]=map[pos][i]+d[pos];
        }
    }
}
int main(int argc, char *argv[])
{
    while(scanf("%d%d",&n,&m),n||m)
    {
        init();
        for(int i=1;i<=m;i++)
        {
            scanf("%d%d%d",&a,&b,&c);
            if (map[a][b]>c)
            {
                map[a][b]=c;
                map[b][a]=c;
            }
        }
        Dijkstra(1);
        printf("%d\n",d[n]);
    }   
    return 0;
}

0 0