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;
}



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