CF623A Graph and String

CF623A Graph and String

休闲的题目.
WA了5次,hack数据爽的一批.
考虑补图.
显然,补图中,出度为0的点是B.
然后二分图染色.
如果不是二分图,就输出"No"
染完色后,看看是否满足数据即可
写的太丑了,捂脸.

/*header*/
#include <iostream>
#include <cstdio>
#include <cstring>
#include <algorithm>
#include <vector>
#include <cmath>
#define rep(i , x, p) for(int i = x;i <= p;++ i)
#define sep(i , x, p) for(int i = x;i >= p;-- i)
#define gc getchar()
#define pc putchar
#define ll long long
#define mk make_pair
#define fi first
#define se second
using std::min;
using std::max;
using std::swap;
const int maxN = 500 + 7;

inline int gi() {
    int x = 0,f = 1;char c = gc;
    while(c < '0' || c > '9') {if(c == '-')f = -1;c = gc;}
    while(c >= '0' && c <= '9') {x = x * 10 + c - '0';c = gc;}return x * f;
}

void print(int x) {
    if(x < 0) pc('-') , x = -x;
    if(x >= 10) print(x / 10);
    pc(x % 10 + '0');
}

int n , m , dis[maxN][maxN], col[maxN];
bool flag;

void dfs(int now , int cl) {
    col[now] = cl;
    rep(i , 1, n) {
        int v = i;
        if(!dis[now][v]) continue;
        if(col[v] == col[now]) {
            puts("No");
            exit(0);
        }
        if(!col[v]) dfs(v , 3 - cl);
    }
}

int main() {
    n = gi();m = gi();
    rep(i , 1, n) rep(j , 1, n) dis[i][j] = 1;
    rep(i , 1, n) dis[i][i] = 0;
    while(m --) {
        int u = gi() , v = gi();
        dis[v][u] = dis[u][v] = 0;
    }
    int B = 0;bool fl = false;
    for(int i = 1;i <= n;++ i) {
        B = i;
        for(int j = 1;j <= n;++ j)
            if(dis[i][j]) fl = true;
        if(fl) break;
    }
    if(fl) dfs(B , 1);
    rep(i , 1, n) {
        rep(j , 1, i - 1) {
            if(!dis[i][j]) {
                if(col[i] + col[j] == 3) {
                    puts("No");return 0;
                    }
                }
            }
        }
        rep(i , 1, n) {
            if(col[i] == 0) {
                rep(j , 1, n) {
                    if(dis[i][j]) {
                        puts("No");return 0;
                    }
                }
            }
        }
    puts("Yes");
    for(int i = 1;i <= n;++ i) {
        if(col[i] == 0) pc('b');
        if(col[i] == 1) pc('a');
        if(col[i] == 2) pc('c');
    }
    return 0;
}

原文地址:https://www.cnblogs.com/gzygzy/p/10192531.html

时间: 2024-10-08 20:04:19

CF623A Graph and String的相关文章

cf623A. Graph and String(二分图 构造)

题意 题目链接 Sol 可以这样考虑,在原图中没有边相连的点的值肯定是a / c 那么直接二分图染色即可 #include<bits/stdc++.h> #define LL long long using namespace std; const int MAXN = 1001, INF = 1e9 + 10; inline int read() { char c = getchar(); int x = 0, f = 1; while(c < '0' || c > '9') {

codeforces 623A. Graph and String 构造

题目链接 给出一个图, 每个节点只有三种情况, a,b, c. a能和a, b连边, b能和a, b, c,连边, c能和b, c连边, 且无重边以及自环.给出初始的连边情况, 判断这个图是否满足条件. 由题意可以推出来b必然和其他的n-1个点都有连边, 所以初始将度数为n-1的点全都编号为b. 然后任选一个与b相连且无编号的点, 编号为1. 然后所有与1无连边的点都是3. 然后O(n^2)检查一下是否合理. #include <iostream> #include <vector>

【CodeForces 624C】Graph and String

题 题意 n个表示abc三个字符的点,a和b是相连的,b和c是相连的,相同的是相连的,现在给你n个点和他们之间的m条边,判断是否存在这样的字符串,存在则给出一个符合条件的. 分析 我的做法是找出所有的b,因为b是只和自己没有连接,所以有n-1个连线,然后找出第一个不是b的,然后所有和该点没有连线的都设置为c,有连线而不是b的就设置为a,然后再把该点设置为a. 接下来,根据题目条件,判断一下我设置出来的字符串成不成立.就是如果不相连接却是相同字母或者有b字母,还有如果相连接却是a和c,那都是不符合

C. Graph and String

二分图染色 b点跟除自身外所有的点连接,共n-1个,首先把连接n-1个的点全部设为b点,其它点任意一点设为a,与a相连的都是a点,剩余为c点.最后验证是否成立. 验证条件为,所有连接的点之间的差值的绝对值不超过1,未连接的点之间的差值的绝对值都大于1. 1 #include<bits/stdc++.h> 2 #include<stdlib.h> 3 #include<math.h> 4 using namespace std; 5 int mp[520][520]; 6

【Henu ACM Round#16 C】Graph and String

[链接] 我是链接,点我呀:) [题意] 在这里输入题意 [题解] 根据题意:先明确以下规则: 1.如果两个点之间没有边,那么这两个点只能是a或c,且不能相同 2.如果两个点之间有边,那么他们之间的差的绝对值<=1 那么对于点i,如果它和所有的点都相连了,那么就干脆把他变成b. 这样其他点无论选什么都和它没有关系,其他点选什么都可以了 接下里,找到任意一个点j,且点j没有和所有的点相连. 显然这个点只能为a或c,因为它和某个点之间没有边.[规则1] 那么我们就让这个点j设置为a; ①然后对于和j

关于自动寻径和图、邻接表的学习和启发

以后的游戏中可能会用到人物的自动寻径,在网上看到一个非常不错的博文,特学习了一下,并转了过来为以后留着... 再次感谢 Siliphen的分享,本文转载自 http://blog.csdn.net/stevenkylelee/article/details/38408253 本文乃Siliphen原创,转载请注明出处:http://blog.csdn.net/stevenkylelee 本文的实现使用的环境是:Cocos2d-x 3.2,VS2013 本文,我们最终实现的地图行走效果如下2图:

可视化工具solo show-----Prefuse自带例子GraphView讲解

2014.10.15日以来的一个月,挤破了头.跑断了腿.伤透了心.吃够了全国最大餐饮连锁店——沙县小吃.其中酸甜苦辣,绝不是三言两语能够说得清道的明的.校招的兄弟姐妹们,你们懂得…… 体会最深的一句话还是:出来混,迟早要还的. 一个月过去了,迷茫之际有太多无奈,无奈中又夹杂些许庆幸,岁月匆匆,人生不息,奋斗不止. 遵守最初的诺言,继续走我可视化的道路: 上集摘要:一个月博文中大概介绍了可视化的一些常用工具,从可操作性.实用性.交互性等各方面进行了简单的对比和总结,具体参见http://www.c

校园导游系统(C++实现,VC6.0编译,使用EasyX图形库)

//校园导游系统.cpp 1 #include <graphics.h> 2 #include <conio.h> 3 #include <stdio.h> 4 #include <io.h> 5 #include <stdlib.h> 6 #include <string> 7 #include <iostream> 8 #include <math.h> 9 #include <fstream>

Cocos2d-x 地图行走的实现2:SPFA算法

上一节<Cocos2d-x 地图行走的实现1:图论与Dijkstra算法> http://blog.csdn.net/stevenkylelee/article/details/38408253 本节实践另一种求最短路径算法:SPFA 1.寻路算法实现上的优化 上一节我们实现的Dijkstra用了一个哈希表来保存搜索到的路径树.如果能用直接的访问的方式,就不要用哈希表,因为直接访问的方式会比哈希表更快.我们修改一下图顶点的数据结构.如下: /* 图顶点 */ class Vertex { fr