hdu2544 迪杰斯特拉题目优化

点击打开题目链接

迪杰斯特拉的用法不多讲,详见  点击打开链接 。

下面两个代码:


这个是用邻接矩阵存图的迪杰斯特拉。

#include<stdio.h>
int main()
{

    int e[1005][1005],dis[1005],book[1005],i,j,n,m,t1,t2,t3,u,v,min;
    int inf=9999999;
    while(scanf("%d%d",&n,&m)!=EOF)
    {
        if(m==n&&n==0) return 0;
        for(i=1; i<=n; i++)
        {
            for(j=1; j<=n; j++)
            {
                if(i==j) e[i][j]=0;
                else e[i][j]=inf;

            }
        }
        for(i=1; i<=m; i++)
        {
            scanf("%d%d%d",&t1,&t2,&t3);
            e[t1][t2]=e[t2][t1]=t3;
        }
        for(i=1; i<=n; i++)
        {
            dis[i]=e[1][i];
        }
        for(i=0; i<=n; i++)
        {
            book[i]=0;
        }
        book[1]=1;

        for(i=1; i<n; i++)
        {
            min=inf;
            for(j=1; j<=n; j++)
            {
                if(book[j]==0&&dis[j]<min)
                {
                    min=dis[j];
                    u=j;

                }
            }
            book[u]=1;
            for(v=1; v<=n; v++)
            {
                if(e[u][v]<inf)
                    if(dis[v]>dis[u]+e[u][v])
                        dis[v]=dis[u]+e[u][v];
            }

        }
        // for(i=1; i<=n; i++)
        printf("%d\n",dis[n]);
    }
    return 0;
}

用数组模拟邻接表的迪杰斯特拉:数组模拟邻接表详见 点击打开链接

#include <iostream>
#include <stdio.h>
#include <string.h>
using namespace std;
#define MAX_SIZE 10005
const int INF=2e9+1e8;

int start[MAX_SIZE],terminal[MAX_SIZE],value[MAX_SIZE];
int first[MAX_SIZE],nexts[MAX_SIZE],dis[MAX_SIZE],vis[MAX_SIZE];
int main()
{
    int n,m,i,j,minn,k;
    while(scanf("%d %d",&n,&m)!=EOF) //  n个点m条边
    {
        if(n==m&&m==0) return 0;
        for(i=1; i<=n; i++)  // 初始化 first 数组
            first[i]=-1;
        for(i=1; i<=m; i++) //  存入m条边
        {
            int ss,ee,vv;
            scanf("%d %d %d",&ss,&ee,&vv);

            start[i*2-1]=ss,terminal[i*2-1]=ee,value[i*2-1]=vv;
            nexts[i*2-1]=first[start[i*2-1]];
            first[start[i*2-1]]=i*2-1;

            start[i*2]=ee,terminal[i*2]=ss,value[i*2]=vv;
            nexts[i*2]=first[start[i*2]];
            first[start[i*2]]=i*2;
        }
        // 初始化 dis 数组
        k=first[1];
        for(i=1; i<=n; i++)
            dis[i]=INF;
        while(k!=-1)
        {
            dis[terminal[k]]=value[k];
            k=nexts[k];
        }
        memset(vis,0,sizeof(vis)); // 标记当前位置是否来过   0 表示还没有来过
        vis[1]=1;
        int mid_pos;
        int times=n-1;
        // 迪杰斯特拉 核心代码
        while(times--)
        {
            minn=INF;
            for(j=1; j<=n; j++)
            {
                if(vis[j]==0&&dis[j]<minn)
                {
                    minn=dis[j];
                    mid_pos=j;
                }
            }
            if(minn==INF) continue;
            vis[mid_pos]=1;
            //  遍历 pos 点能到的地方
            k=first[mid_pos];
            while(k!=-1)
            {
                if(dis[mid_pos]+value[k]<dis[terminal[k]]) dis[terminal[k]]=dis[mid_pos]+value[k];
                k=nexts[k];
            }
        }
//        for(i=1; i<=n; i++)
//            printf("%d ",dis[i]);
//        printf("\n");
        printf("%d\n",dis[n]);
    }
    return 0;
}




posted @ 2016-04-24 21:29  Code-dream  阅读(112)  评论(0编辑  收藏  举报