Kids' Wishes

Kids’ Wishes

这里写图片描述
.
.
题意:给出n个小朋友,m个要求,要求 x 和 y 坐在一起,问是否可能。
.
.
解法:首先坐在一起的互连一条有向边,然后判断如果有点的度数大于2那么一定不行,如果图中存在一个小于n的环,那么一定不行。
.
.

#include <cstdio>
#include <iostream>
#include <algorithm>
#include <cmath>
#include <vector>
#include <queue>
#include <set>
#include <cstring>

using namespace std;

const int maxe=1e5+5;
const int maxn=2*maxe;
const int INF=1e9+5;

int k, w, len;
vector<int> g[maxn];
int u[maxn], v[maxn], d[maxn], f[maxn];
set<pair<int, int> > m;

void init() {
    for (int i=0; i<maxn; i++) g[i].clear();
    memset(d, -1, sizeof(d));
    len=INF;
    m.clear();
}

int b[maxn], cnt;

void bfs(int s) {
    queue<int> Q;
    Q.push(s); d[s]=0; f[s]=-1;
    while (!Q.empty()) {
        int u=Q.front(); Q.pop();
        for (int i=0; i<g[u].size(); i++) if (g[u][i]!=f[u]) {
            int v=g[u][i];
            if (d[v]==-1) {
                d[v]=d[u]+1;
                f[v]=u;
                Q.push(v);
            }
            else {
                len=min(len, d[v]+d[u]+1);
            }
        }
    }
}

inline int getid(int x) {return lower_bound(b, b+cnt, x)-b;}

int main() {
    while (scanf("%d%d", &k, &w)==2) {
        if (!k&&!w) return 0;
        init();
        for (int i=0; i<w; i++) {
            scanf("%d%d", u+i, v+i);
            b[2*i]=u[i], b[2*i+1]=v[i];
        }
        cnt=2*w;
        sort(b, b+cnt);
        cnt=unique(b, b+cnt)-b;
        bool flag=true;
        for (int i=0; i<w; i++) {
            u[i]=getid(u[i]), v[i]=getid(v[i]);
            m.insert(make_pair(u[i], v[i]));
            m.insert(make_pair(v[i], u[i]));
        }
        for (set<pair<int, int> >::iterator it=m.begin(); it!=m.end(); it++) {
            int x=it->first, y=it->second;
            g[x].push_back(y);
            if (g[x].size()>2) flag=false;
        }
        if (flag) {
            for (int i=0; i<cnt; i++) if (d[i]==-1) bfs(i);
            // cout << len << endl;
            if (len<k) flag=false;
        }
        puts(flag?"Y":"N");
    }
}
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
《Python for Kids》是一本专为孩子们学习编程而编写的电子书。它以亲切的语言和生动的插图来解释Python编程语言的基础概念和技巧。这本书适合初学者,不需要任何编程经验,并且对年龄在10岁以上的孩子们非常友好。 这本书的作者是Jason R. Briggs,他通过有趣的练习和项目来引导孩子们逐步学习Python编程。他用简单易懂的语言将编程概念和知识点解释得非常清晰。此外,书中的插图和例子都很有趣,可以激发孩子们的学习兴趣,并帮助他们更好地理解编程的概念。 《Python for Kids》涵盖了Python编程的各个方面,包括变量、循环、条件语句、函数等。它还引入了简单的游戏编程概念,使孩子们能够通过编写游戏来实践所学的知识。书中的例子和项目设计得非常实用,孩子们可以通过完成这些练习来巩固他们的学习成果。 这本电子书还提供了一些额外的学习资源,包括Python编辑器和扩展包的下载链接以及在线论坛,孩子们可以在这里交流并获得帮助。这些资源可以进一步加深孩子们对编程的理解,帮助他们更好地掌握Python语言。 总的来说,《Python for Kids》是一本非常适合孩子们入门学习Python编程的电子书。它通过简单、有趣的方式引导孩子们掌握编程基础,并通过练习和项目帮助他们将所学知识应用到实践中。这本书可以激发孩子们对编程的兴趣,培养他们的逻辑思维和问题解决能力。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值