CF Gym 102059E Electronic Circuit (set存图删点)

链接:https://codeforces.com/gym/102059/problem/E

题意:n个点, m条线,问这个电路是否合法,合法:可以确定一个起点和一个终点。

题解:不断的删点,删除度数为2的点,再相连,看最终度数为1的点的个数是否为2。set存图

#include <bits/stdc++.h>
using namespace std;

const int maxn=3e5+5;
set<int> S[maxn];
int n, m;

void del_edge()
{
    queue<int> que;
    for(int i=1; i<=n; i++)
        if(S[i].size()==2)
            que.push(i);
    while(!que.empty())
    {
        int u=que.front(); que.pop();
        if(S[u].size()!=2) continue;
        int pre=*S[u].begin(); S[u].erase(S[u].begin());
        int sub=*S[u].begin(); S[u].erase(S[u].begin());
        S[pre].erase(u); S[sub].erase(u);
        S[pre].insert(sub); S[sub].insert(pre);
        if(S[pre].size()==2) que.push(pre);
        if(S[sub].size()==2) que.push(sub);
    }
}

bool check()
{
    int cnt=0;
    for(int i=1; i<=n; i++)
        if(S[i].size()) cnt++;
    return cnt==2;
}

int main()
{
    ios::sync_with_stdio(false); cin.tie(0);
    cin>>n>>m;
    for(int i=0; i<m; i++)
    {
        int u, v;
        cin>>u>>v;
        S[u].insert(v);
        S[v].insert(u);
    }
    del_edge();
    printf(check()? "Yes":"No");
    return 0;
}

原文地址:https://www.cnblogs.com/Yokel062/p/11650583.html

时间: 2024-10-14 06:26:42

CF Gym 102059E Electronic Circuit (set存图删点)的相关文章

Safe Path(bfs+一维数组存图)

题目链接:http://codeforces.com/gym/101755/problem/H 题目分析:先bfs一遍怪兽可以到达的点,再bfs人可以走的地方看可不可以到达终点: 很显然读到  2<=n*m<=200000 时,就不可以用二维数组存图了,不过据说因为数据比较水,可以用vector存图: vector存图AC代码: 1 /* */ 2 # include <iostream> 3 # include <stdio.h> 4 # include <st

生化危机 邻接表存图+BFS

生化危机 发布时间: 2015年10月10日 18:05   时间限制: 1000ms   内存限制: 256M 描述 X博士想造福人类, 研发一种可以再生肢体的药物, 可是很不幸......研究失败了, 他在蜥蜴身上实验的时候, 蜥蜴发生了变异, 更糟糕的是, 蜥蜴逃出了生化实验室. 恐怖的事情发生了, 疫情以X博士所在的城市为中心向四周扩散开, 最终, 整个地球上的城市都被感染了.假设整个地球一共有N个城市, 这N个城市是连通的, 有N-1条通道把他们连接起来.病毒会以一座城市为中心,在一天

整合:图论存图方法及三种重要做法分析(Kruskal Dijkstra Bellman-Ford)

一.最短生成路的2种存图方法(邻接矩阵和邻接表): 1)邻接矩阵(适合稠密图即边远远多于点): 1.时间复杂度一般在n^2: 2.可以解决重边情况:map[i][j] = min( map[i][j] , input); 3.初始化:a[i][j] = INF;  a[i][i] = 0; 4.邻接矩阵点的最大极限在3000左右 5.图示: 2)邻接表(适合疏密图即边数近似于点数): 1.时间复杂度一般在mlog(n): 2.数组实现邻接表: ①定义:每个节点i都有一个链表,里面保存着从i出发的

最短路 spfa 算法 &amp;&amp; 链式前向星存图

推荐博客  https://i.cnblogs.com/EditPosts.aspx?opt=1 http://blog.csdn.net/mcdonnell_douglas/article/details/54379641 spfa  自行百度 说的很详细 spfa 有很多实现的方法  dfs  队列  栈  都可以 时间复杂度也不稳定 不过一般情况下要比bellman快得多 #include <stdio.h> #include <math.h> #include <st

HDU 4857 逃生(拓扑排序逆向+邻接表存图)

题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=4857 题目: Problem Description 糟糕的事情发生啦,现在大家都忙着逃命.但是逃命的通道很窄,大家只能排成一行. 现在有n个人,从1标号到n.同时有一些奇怪的约束条件,每个都形如:a必须在b之前.同时,社会是不平等的,这些人有的穷有的富.1号最富,2号第二富,以此类推.有钱人就贿赂负责人,所以他们有一些好处. 负责人现在可以安排大家排队的顺序,由于收了好处,所以他要让1号尽量靠前,

CF gym 101933 K King&#39;s Colors —— 二项式反演

题目:http://codeforces.com/gym/101933/problem/K 其实每个点的颜色只要和父亲不一样即可: 所以至多 i 种颜色就是 \( i * (i-1)^{n-1} \),设为 \( f(i) \),设恰好 i 种颜色为 \( g(i) \) 那么 \( f(i) = \sum\limits_{j=0}^{i} C_{i}^{j} * g(j) \) 二项式反演得到 \( g(i) = \sum\limits_{j=0}^{k} (-1)^{k-j} * C_{k}

邻接表存图

邻接表也叫边表,也是OI中常用的存图方法之一,以后所有的图论算法 我都打算用这个写,具体也不难理解. 这种存图方式是用了N(点的个数)个链表将整个图串联起来,串联方式 便是那个first数组. 我们首先定义了一个结构体,结构体一共有三个参数,终点,权值,这个边 的下一条边. 具体操作:每当输入一条边的数据时,我们将这组数据送进加边函数(也可以 直接写在main函数中的for循环里)cnt是边数,是一个给每条边编号的工具 我们存一下第cnt条边的终点权值以及与cnt相关的下一条边,这个串联是通过

基础图论--存图

图论蛮好玩的呢  比起数论真是有趣多了 有空整理一下下 首先,图是个什么鬼东东呢 graph, 一堆点集,一堆边集,可以把各种事物抽象成点,事物之间的联系用边来表示,边上还可有权值,表示距离费用等 e.g. 把各个城市抽象成点,城市之间可以由高铁直达的称作有联系(边), 边上还可附加权值,俩城市间距离等 至于一些基本概念, 有向无向,是否成环,入度出度等就不多讲啦 基本概念理解就好 现在看看存图,看不同情况来选适合的存图方式 邻接矩阵---二维矩阵 a[ n ][ m ], 可用a[i][j]=

B - Cow Marathon DFS+vector存图

After hearing about the epidemic of obesity in the USA, Farmer John wants his cows to get more exercise, so he has committed to create a bovine marathon for his cows to run. The marathon route will include a pair of farms and a path comprised of a se