POJ 3767 I Wanna Go Home(最短路/Floyd)

题目:http://acm.hust.edu.cn/vjudge/contest/view.action?cid=114427#problem/G

代码:

#include<stdio.h>
#include<string.h>
#include<algorithm>

#define maxn 999999999

using namespace std;

int maps[605][605];
int a[605];

int main()
{
    int n;
    while(~scanf("%d",&n))
    {
        memset(maps,0,sizeof(maps));
        memset(a,0,sizeof(a));

        if(n==0)
            break;
            
        int m;
        scanf("%d",&m);
        int x,y,ui;

        for(int i=1;i<=n;i++)
        {
            for(int j=1;j<=n;j++)
            {
                maps[i][j]=maxn;
            }
        }

        for(int i=0;i<m;i++)
        {
            scanf("%d%d%d",&x,&y,&ui);
            maps[x][y]=ui;
            maps[y][x]=ui;
        }

        for(int i=1;i<=n;i++)
        {
            scanf("%d",&a[i]);
        }
        
         for(int i=1;i<=n;i++)
        {
            for(int j=1;j<=n;j++)
            {
                if(a[i]!=a[j])
                {
                    if(a[i]==1&&a[j]==2)
                        maps[j][i]=maxn;
                    else if(a[i]==2&&a[j]==1)
                        maps[i][j]=maxn;
                }
            }
        }
        /*for(int i=1;i<=n;i++)
        {
            for(int j=1;j<=n;j++)
            {
               printf("%d ",maps[i][j]);
            }
            printf("\n");
        }*/
        
        for(int k=1;k<=n;k++)
        {
            for(int i=1;i<=n;i++)
            {
                for(int j=1;j<=n;j++)
                {
                    if(maps[i][j]>maps[i][k]+maps[k][j])
                        maps[i][j]=maps[i][k]+maps[k][j];
                }
            }
        }
        printf("%d\n",maps[1][2]==maxn ? -1 : maps[1][2]);
    }
}


分析:

起点是1,终点是2.

n个城市,m个边。

每个城市不是属于A,就是属于B。

从起点开始走,至多有1次可以从属于A的城市到属于B的城市(或从属于B的城市到属于A的城市)。

求最短路。

属于相同的领导者,两个城市可以建双向的边。

属于不同的领导者,只能走一次单向的边。

起始从1(A的城市),到2(B的城市)。maps[小][大]表示A的城市可以到B的城市的距离,maps[大][小]表示可以从B的城市到A的城市的距离。

if(a[i]==1&&a[j]==2) 也就是从A的城市到B的城市。必须将从B的城市到A的城市的边变为maxn。(不变的化 可能再走这条边 不满足题意)
还有当a[j]==2也就是说此后只能走B的城市(即两个城市都是B的)
 
 
 
 
有问题。

你可能感兴趣的:(POJ 3767 I Wanna Go Home(最短路/Floyd))