• <ins id="pjuwb"></ins>
    <blockquote id="pjuwb"><pre id="pjuwb"></pre></blockquote>
    <noscript id="pjuwb"></noscript>
          <sup id="pjuwb"><pre id="pjuwb"></pre></sup>
            <dd id="pjuwb"></dd>
            <abbr id="pjuwb"></abbr>

            pku 1847

            2009年7月24日

            題目鏈接:PKU 1847 Tram

            分類:最短路

            題目分析與算法原型
                     將需要搬動(dòng)的開關(guān)的節(jié)點(diǎn)的權(quán)值設(shè)為1,不需要搬動(dòng)的開關(guān)設(shè)為0,不可達(dá)的設(shè)為一個(gè)充分大的數(shù),這樣一來,此題就轉(zhuǎn)換為最短路徑問題了,3種方法(Dijkastra,Floyd以及Bellman-Ford)都可以解決

            Code1: (Floyd)

             1
            #include<stdio.h>
             2#define Len 105
             3#define max 99999999
             4
             5int a[Len][Len],i,j,k,n,A,B,t;
             6
             7void init()
             8{
             9    for(i=1;i<=n;i++)
            10        for(j=1;j<=n;j++)
            11        {
            12            if(i==j)a[i][j]=0;
            13            else a[i][j]=max;
            14        }

            15}

            16int main()
            17{
            18    scanf("%d%d%d",&n,&A,&B);
            19    init();
            20    for(i=1;i<=n;i++)
            21    {
            22        scanf("%d",&k);
            23        for(j=1;j<=k;j++)
            24        {
            25            scanf("%d",&t);
            26            if(j==1)a[i][t]=0;
            27            else a[i][t]=1;
            28        }

            29    }

            30    for(k=1;k<=n;k++)
            31        for(i=1;i<=n;i++)
            32            for(j=1;j<=n;j++)
            33                if(a[i][k]+a[k][j]<a[i][j])a[i][j]=a[i][k]+a[k][j];
            34    
            35    if(a[A][B]==max)printf("-1\n");
            36    else printf("%d\n",a[A][B]);
            37    return 0;
            38}

            39
            40
             Code2:    (Dijkastra)
             
             1
            #include<stdio.h>
             2#include<string.h>
             3#define Len 105
             4#define max 99999999
             5int a[Len][Len],i,j,k,n,A,B,t,flag[Len],dis[Len],min,u;
             6void init()
             7{
             8    for(i=1;i<=n;i++)
             9        for(j=1;j<=n;j++)
            10        {
            11            if(i==j)a[i][j]=0;
            12            else a[i][j]=max;
            13        }

            14}

            15void Dij()
            16{
            17    for(i=1;i<=n;i++)dis[i]=a[A][i];
            18    flag[A]=1;
            19    for(i=1;i<n;i++)
            20    {
            21        min=max;
            22        for(j=1;j<=n;j++)
            23            if(flag[j]==0&&dis[j]<min)
            24            {
            25                u=j;
            26                min=dis[j];
            27            }

            28            if(min==max)return;
            29
            30            flag[u]=1;
            31            for(j=1;j<=n;j++)
            32                if(flag[j]==0&&a[u][j]<max&&dis[u]+a[u][j]<dis[j])
            33                    dis[j]=dis[u]+a[u][j];
            34    }

            35}

            36int main()
            37{
            38    scanf("%d%d%d",&n,&A,&B);
            39    init();
            40    memset(flag,0,sizeof(flag));
            41    for(i=1;i<=n;i++)
            42    {
            43        scanf("%d",&k);
            44        for(j=1;j<=k;j++)
            45        {
            46            scanf("%d",&t);
            47            if(j==1)a[i][t]=0;
            48            else a[i][t]=1;
            49        }

            50    }

            51    Dij();
            52    if(dis[B]==max)printf("-1\n");
            53    else printf("%d\n",dis[B]);
            54    return 0;
            55}

            56
            57
            Code3:(Bellman-Ford) 

             1
            #include<stdio.h>
             2#define Len 105
             3#define max 99999999
             4
             5int a[Len][Len],k,n,A,B,t,dis[Len];
             6
             7void init()
             8{
             9    int i,j;
            10    for(i=1;i<=n;i++)
            11        for(j=1;j<=n;j++)
            12        {
            13            if(i==j)a[i][j]=0;
            14            else a[i][j]=max;
            15        }

            16}

            17
            18void bellman_ford()
            19{
            20    int queue[Len*100]={0},pos=0,fp=0,i;
            21    queue[pos++]=A;
            22    queue[pos++]=n+1;
            23    for(i=1;i<=n;i++)dis[i]=max;
            24    dis[A]=0;
            25    int N=1;
            26    while(queue[fp])
            27    {
            28        int u;
            29        while((u=queue[fp++])==n+1)
            30        {
            31            if(N++>n+1)return ;
            32            queue[pos++]=n+1;
            33        }

            34        for(i=1;i<=n;i++)
            35        {
            36            if(i!=u&&a[u][i] < max)
            37            {
            38                if(dis[i]>dis[u]+a[u][i])
            39                {
            40                    dis[i]=dis[u]+a[u][i];
            41                    queue[pos++]=i;
            42                }

            43            }

            44        }

            45    }

            46}

            47
            48int main()
            49{
            50    scanf("%d%d%d",&n,&A,&B);
            51    init();
            52    int i,j;
            53    for(i=1;i<=n;i++)
            54    {
            55        scanf("%d",&k);
            56        for(j=1;j<=k;j++)
            57        {
            58            scanf("%d",&t);
            59            if(j==1)a[i][t]=0;
            60            else a[i][t]=1;
            61        }

            62    }

            63    bellman_ford();
            64    if(dis[B]==max)printf("-1\n");
            65    else printf("%d\n",dis[B]);
            66    return 0;
            67}

            68
            Code4:(Bellman-Ford)

             1
            #include<stdio.h>
             2#define Len 105
             3#define max 99999999
             4
             5int a[Len][Len],i,j,k,n,A,B,t,dis[Len];
             6
             7void init()
             8{
             9    for(i=1;i<=n;i++)
            10        for(j=1;j<=n;j++)
            11        {
            12            if(i==j)a[i][j]=0;
            13            else a[i][j]=max;
            14        }

            15}

            16
            17void bellman_ford()
            18{
            19    int i,j,k;
            20    for(i=1;i<=n;i++)dis[i]=max;
            21    dis[A]=0;
            22    for(i=1;i<n;i++)
            23    {
            24        for(j=1;j<=n;j++)
            25            for(k=1;k<=n;k++)
            26            {
            27                if(j==k)continue;
            28                if(dis[k]>dis[j]+a[j][k])
            29                    dis[k]=dis[j]+a[j][k];
            30            }

            31    }

            32}

            33
            34int main()
            35{
            36    scanf("%d%d%d",&n,&A,&B);
            37    init();
            38    for(i=1;i<=n;i++)
            39    {
            40        scanf("%d",&k);
            41        for(j=1;j<=k;j++)
            42        {
            43            scanf("%d",&t);
            44            if(j==1)a[i][t]=0;
            45            else a[i][t]=1;
            46        }

            47    }

            48    bellman_ford();
            49    if(dis[B]==max)printf("-1\n");
            50    else printf("%d\n",dis[B]);
            51    return 0;
            52}

            53
            54
            55

            posted on 2009-07-24 19:07 蝸牛也Coding 閱讀(309) 評(píng)論(2)  編輯 收藏 引用

            評(píng)論

            # re: pku 1847 2009-09-10 18:02 Johnnx

            if(j==1)a[i][t]=0;
            你代碼里的這一句是什么意思,我不太明白?但卻是必須的。能給我解釋一下嗎  回復(fù)  更多評(píng)論   

            # re: pku 1847 2009-09-11 01:37 蝸牛也Coding

            Switch in the i-th intersection is initially pointing in the direction of the first intersection listed.
            注意題目中的這句話  回復(fù)  更多評(píng)論   


            只有注冊(cè)用戶登錄后才能發(fā)表評(píng)論。
            網(wǎng)站導(dǎo)航: 博客園   IT新聞   BlogJava   博問   Chat2DB   管理


            <2010年2月>
            31123456
            78910111213
            14151617181920
            21222324252627
            28123456
            78910111213

            導(dǎo)航

            統(tǒng)計(jì)

            常用鏈接

            留言簿(8)

            隨筆檔案(78)

            搜索

            積分與排名

            最新評(píng)論

            閱讀排行榜

            評(píng)論排行榜

            久久亚洲日韩精品一区二区三区| 国产精品免费久久| 亚洲综合精品香蕉久久网| 少妇熟女久久综合网色欲| 精品久久久久久久久免费影院| 久久精品综合网| 九九99精品久久久久久| 伊人久久综在合线亚洲2019 | 久久免费视频网站| 人人狠狠综合久久亚洲| 亚洲国产精品高清久久久| 99久久99久久精品免费看蜜桃| 国产成人精品久久亚洲| 久久久久久精品免费看SSS| 精品国产91久久久久久久| 亚洲第一永久AV网站久久精品男人的天堂AV| 亚洲Av无码国产情品久久| 国内精品九九久久久精品| 久久久无码精品午夜| 久久人人爽人人精品视频| 久久久久久久精品妇女99| 亚洲精品国产成人99久久| 99久久精品免费看国产一区二区三区 | 亚洲女久久久噜噜噜熟女| 亚洲综合精品香蕉久久网97| 亚洲七七久久精品中文国产 | 久久久久四虎国产精品| 18禁黄久久久AAA片| 久久av高潮av无码av喷吹| 精品熟女少妇av免费久久| 亚州日韩精品专区久久久| 青青草原综合久久| 久久精品亚洲日本波多野结衣| 亚洲精品无码久久毛片| 国产精品伊人久久伊人电影| 久久青青草原亚洲av无码app| 综合久久给合久久狠狠狠97色| 一本伊大人香蕉久久网手机| 久久亚洲私人国产精品| 亚洲精品美女久久久久99| 久久这里只有精品首页|