zoukankan      html  css  js  c++  java
  • 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;
    }
    

      

  • 相关阅读:
    P1865 A % B Problem
    P1198 [JSOI2008]最大数
    从英语学习写起,收获2013属于我的金秋
    Hadoop--有关Hadoop的启动
    android中文字高亮设置案例
    <Win32_16>来看看标准菜单和右键菜单的玩法
    jQuery 自学笔记—3
    【译】如何精确判断最终用户响应时间过长的原因?
    网络爬虫返回json处理数据
    2013--转变
  • 原文地址:https://www.cnblogs.com/liulangye/p/2873376.html
Copyright © 2011-2022 走看看