hdu2066----------dijkstra模板题

这是一道多源点的dijkstra模板题,我整整做了一上午,交了14遍,过了4遍(呵呵,很疯狂啊!)

总的来说,收获颇丰。应该算完全掌握了这种算法。这是第一次过的代码,用的超级笨的方法,对每个起点和终点分别调用dij算法。

放在low[i][j] (代表第i个点到第j个点的最短距离) 中,最后再从low[i][j]找出最短的路径输出。    890ms过的。呵呵,很强,几乎没有比我更慢的啦!嘿嘿(不好意思) ,代码也很长。

 

AC:

#include<stdio.h>
#include<string.h>
#define inf 100000000

int map[1051][1051];
int s[1051];
int d[1051];

int from[1051];         //有s 个起点
int want[1051];         //有d 个终点

int low[1051][1051];     //low[i][j]  表示第i个点到第j 个点的最短路径

int dij(int v,int e)      //起点v,终点e
{
    int i,j,min,pos;
    for(i=1;i<=1050;i++)
    {
        s[i]=0;
        d[i]=map[v][i];
    }
    s[v]=1;
    d[v]=0;
    for(i=1;i<1050;i++)
    {
        min=inf;
        for(j=1;j<=1050;j++)
        {
            if(!s[j]&&min>d[j])
            {
                pos=j;
                min=d[j];
            }
        }
        s[pos]=1;
       
        if(pos==e||min==inf) break;        //不要怀疑自己 ,这里没有错误! 我的思想是正确的
       
        for(j=1;j<=1050;j++)
        {
            if(!s[j]&&d[j]>(d[pos]+map[pos][j]))
            d[j]=d[pos]+map[pos][j];
        }
    }
    return d[e];
}       
int main()
{
    int t,s,d;
    int i,j,k;
    int a,b,time;
    while(scanf("%d%d%d",&t,&s,&d)!=EOF)
    {
        for(i=1;i<=1050;i++)
        {
            for(j=1;j<=1050;j++)
            {
                map[i][j]=inf;
                low[i][j]=inf;
            }
        }
       
        //memset(map,100000000,sizeof(map));
        //memset(low,100000000,sizeof(low));
       
        for(i=1;i<=t;i++)
        {
            scanf("%d%d%d",&a,&b,&time);
            {
    if(map[a][b]>time)                   //这点很操蛋,没读清题意,WA了n多次!
    map[a][b]=map[b][a]=time;            //两个点之间可以有多条路,每次找最短边,输入地图中
   }
        }
        for(i=1;i<=s;i++)
        scanf("%d",&from[i]);
        for(i=1;i<=d;i++)
        scanf("%d",&want[i]);
       
        for(i=1;i<=s;i++)
        {
            for(j=1;j<=d;j++)                       //我的方法很笨,对每个点调用dij,所以就很耗时间
            {                                        //说明对dij算法 还不是很清楚。
                                            //事实上,对每个起点调用dij算法,就得到了所有结果了
                low[i][j]=dij(from[i],want[j]);
            }
        }
        k=inf;
        for(i=1;i<=s;i++)       
        {
            for(j=1;j<=d;j++)
            {
                if(k>low[i][j])
                k=low[i][j];
            }
        }
        printf("%d\n",k);
    }
    return 0;
}   
   

posted on 2012-03-20 14:43  hrbust_09zhangyabin  阅读(394)  评论(0编辑  收藏  举报