1630. Talisman

http://acm.timus.ru/problem.aspx?space=1&num=1630

俄罗斯人的英语 你伤不起呀 看了N久也没看懂什么意思 最后查了N久 然后查了一份题解

关键在于这句话  “ then the minimal number of rods in a chain connecting these balls must be equal
to the distance in centimeters between the centers of the balls”

其实就是  两个球的最短连接 rod 数量必须等于这两个球的距离  反过来就好理解了 这两个球的距离等于 连接他们最短的那条链 的rod 数量

如果连接他们的最少的一条链 有k个rods  那么它们之间的距离就必须是 k

对于第二个样例   4 和 2 之间最少有两个rods  4和3之间也最少有两个rods  但是 4在和1 距离为1cm的情况下 无法同时和2 ,3的距离都是2cm

对于一个联通量  符合条件有两种情况

1,是一条长链

2,球的数量小于等于4 且是全图

代码:

#include<iostream>

#include<cstdio>

#include<cstring>

#include<string>

#include<map>

#include<vector>

#include<stack>

#include<set>

#include<map>

#include<queue>

#include<algorithm>

#include<cmath>

#define LL long long

#define sint short int

//#pragma comment(linker, "/STACK:1024000000,1024000000")

using namespace std;

const int N=105;

const int INF=0x3f3f3f3f;

vector<int>vt[N];

vector<int>tmp;

bool visited[N];

void dfs(int x)

{

    visited[x]=true;

    tmp.push_back(x);

    for(unsigned int i=0;i<vt[x].size();++i)

    {

        if(!visited[vt[x][i]])

        dfs(vt[x][i]);

    }

}

int main()

{

    //freopen("data.in","r",stdin);

    int n,m;

    cin>>n>>m;

    while(m--)

    {

        int l,r;

        cin>>l>>r;

        vt[l].push_back(r);

        vt[r].push_back(l);

    }

    memset(visited,false,sizeof(visited));

    for(int i=1;i<=n;++i)

    if(!visited[i])

    {

        tmp.clear();

        dfs(i);

        int sum=0;

        int M1=0,M2=0;

        int m=tmp.size();

        for(int i=0;i<m;++i)

        {

             int k=tmp[i];

             sum+=vt[k].size();

             if(vt[k].size()==2)

             ++M2;

             if(vt[k].size()==1)

             ++M1;

        }

        if(M1==2&&M1+M2==m)

        continue;

        if(m<=4&&m*(m-1)==sum)

        continue;

        cout<<"Unlucky Petr"<<endl;

        return 0;

    }

    cout<<"Luck is possible"<<endl;

    return 0;

}

  

 

你可能感兴趣的:(man)