hdu 1869 六度分離(Floyd)

題意:

數據是否能滿足任何兩個人都可以通過最多六個人認識

即求每個人與其他人的聯繫是否都小於等於7

用Floyd 無向圖 初始有聯繫的標記1

mp[i][j]加點k,使數組內最後剩下的是第i人與其他人之間的路徑長度,即可以通過幾個人認識

如第一組數據的mp爲

0 1 2 3 4 5 6 7
1 0 1 2 3 4 5 6
2 1 0 1 2 3 4 5
3 2 1 0 1 2 3 4
4 3 2 1 0 1 2 3
5 4 3 2 1 0 1 2
6 5 4 3 2 1 0 1
7 6 5 4 3 2 1 0

mp值最遠的爲7也可以通過六人聯繫

如不連通,即無法跟某些人有聯繫,值爲inf,自然比7大,不滿足

#include <iostream>
#include <cstring>
#include <cstdio>
#include <algorithm>
using namespace std;
const int inf=0x3f3f3f3f;
int mp[105][105],n,m,a,b;
void Floyd()
{
    for(int k=0;k<n;k++)
        for(int i=0;i<n;i++)
        for(int j=0;j<n;j++)
    {
        if(i!=j)
            mp[i][j]=min(mp[i][j],mp[i][k]+mp[k][j]);
    }
}
int main()
{
    while(scanf("%d%d",&n,&m)!=EOF)
    {
        int flag=0;
        for(int i=0;i<n;i++)
            for(int j=0;j<n;j++)
            mp[i][j]=i==j?0:inf;
        //memset(mp,inf,sizeof(mp));
        for(int i=0;i<m;i++)
        {
       cin>>a>>b;
            mp[a][b]=mp[b][a]=1;
        }
        Floyd();
        for(int i=0;i<n;i++)
        {
            for(int j=0;j<n&&!flag;j++)
            {
                if(i!=j&&mp[i][j]>7)
                {
                    flag=1;
                }
            }
        }
        if(!flag)
            cout<<"Yes"<<endl;
            else cout<<"No"<<endl;
    }
    return 0;
}



發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章