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>
#include <cstdio>
#include <cstring>
#include <algorithm>
#include <cmath>
#include <map>
#include <set>
#include <string>
#include <queue>
#include <stack>
#include <bitset>
using namespace std;
#define pb(x) push_back(x)
#define ll long long
#define mk(x, y) make_pair(x, y)
#define lson l, m, rt<<1
#define mem(a) memset(a, 0, sizeof(a))
#define rson m+1, r, rt<<1|1
#define mem1(a) memset(a, -1, sizeof(a))
#define mem2(a) memset(a, 0x3f, sizeof(a))
#define rep(i, n, a) for(int i = a; i<n; i++)
#define fi first
#define se second
typedef pair<int, int> pll;
const double PI = acos(-1.0);
const double eps = 1e-8;
const int mod = 1e9+7;
const int inf = 1061109567;
const int dir[][2] = { {-1, 0}, {1, 0}, {0, -1}, {0, 1} };
int a[260000], b[260000], de[505], c[505];
int mp[505][505];
int main()
{
    int n, m, pos = 0;
    cin>>n>>m;
    for(int i = 0; i<m; i++) {
        scanf("%d%d", &a[i], &b[i]);
        de[a[i]]++, de[b[i]]++;
        mp[a[i]][b[i]] = mp[b[i]][a[i]] = 1;
    }
    for(int i = 1; i<=n; i++) {
        if(de[i] == n-1) {
            c[i] = 2;
        }
    }
    for(int i = 1; i<=n; i++) {
        if(!c[i]) {
            pos = i;
            c[i] = 1;
            break;
        }
    }
    if(!pos) {
        puts("Yes");
        for(int i = 0; i<n; i++)
            cout<<‘b‘;
        return 0;
    }
    for(int i = 1; i<=n; i++) {
        if(i == pos)
            continue;
        if(!mp[i][pos])
            c[i] = 3;
        else if(!c[i])
            c[i] = 1;
    }
    int flag = 0;
    for(int i = 1; i<=n; i++) {
        for(int j = i+1; j<=n; j++) {
            if(abs(c[i]-c[j])>1&&mp[i][j]) {
                flag = 1;
            }
            if(abs(c[i]-c[j])<=1 && !mp[i][j]) {
                flag = 1;
            }
        }
    }
    if(flag) {
        puts("No");
        return 0;
    } else {
        puts("Yes");
        for(int i = 1; i<=n; i++) {
            cout<<char(‘a‘+c[i]-1);
        }
        cout<<endl;
    }
    return 0;
}
时间: 2024-08-28 08:04:07

codeforces 623A. Graph and String 构造的相关文章

Codeforces 429B Working out bfs构造

题目链接:点击打开链接 题意:给定n*m的矩阵 有一个人a从左上角走到右下角,只能↓或→走 另一个人b从左下角走到右上角,只能↑或→走 使得2个人的路径有且仅有一个格子是相交的. 统计2个人的权值和(相交格子的权值和不计) 问最大的权值和是多少. 思路: 首先转换一下题意,也就是找一个格子与4个角落连不相交的线. 我们观察相交的那个格子,那个格子的上下左右必然对应着一个角落. (i,j)点,那么(i-1,j)必然对应左上角或右上角的其中一个角落. 这样(i,j)点的4个相邻格子各自对应一个角落(

Codeforces 346C Number Transformation II 构造

题目链接:点击打开链接 = = 990+ms卡过 #include<stdio.h> #include<iostream> #include<string.h> #include<algorithm> #include<vector> #include<set> using namespace std; #define N 100010 #define L(x) (x<<1) #define R(x) (x<<

Educational Codeforces Round 25 F. String Compression(kmp+dp)

题目链接:Educational Codeforces Round 25 F. String Compression 题意: 给你一个字符串,让你压缩,问压缩后最小的长度是多少. 压缩的形式为x(...)x(...)  x表示(...)这个出现的次数. 题解: 考虑dp[i]表示前i个字符压缩后的最小长度. 转移方程解释看代码,这里要用到kmp来找最小的循环节. 当然还有一种找循环节的方式就是预处理lcp,然后通过枚举循环节的方式. 这里我用的kmp找的循环节.复杂度严格n2. 1 #inclu

C++ string 构造的陷阱

先看代码 #include<iostream> #include<string> using namespace std; int main(int argc, char **argv) { string s = "abcdefghijklmnopqrstuvwxyzabcdefghijklmnopqrstuvwxyzabcdefghijklmnopqrstuvwxyz" + 'A'; cout<<s<<endl; return 0; }

Codeforces 56D Changing a String 编辑距离 dp

题目链接:点击打开链接 编辑距离,,== 一边dp一边记录前驱太累,,还是dp后找路径大法好 #include<iostream> #include<cstdio> #include<vector> #include<string.h> using namespace std; #define ll int #define N 1010 char s[N], t[N]; int dp[N][N], n, m; // 0为插入 1为删除 2 3为替换 stru

CF623A Graph and String

CF623A Graph and String 休闲的题目. WA了5次,hack数据爽的一批. 考虑补图. 显然,补图中,出度为0的点是B. 然后二分图染色. 如果不是二分图,就输出"No" 染完色后,看看是否满足数据即可 写的太丑了,捂脸. /*header*/ #include <iostream> #include <cstdio> #include <cstring> #include <algorithm> #include

Codeforces 1144F Graph Without Long Directed Paths (DFS染色+构造)

<题目链接> 题目大意:给定一个无向图,该无向图不含自环,且无重边.现在要你将这个无向图定向,使得不存在任何一条路径长度大于等于2.然后根输入边的顺序,输出构造的有向图.如果构造的边与输入的方向一致,就输出1,方向不一致就输出0. 解题分析:因为定向后的图不能存在长度大于等于2的路径,所以我们直接对原图进行奇偶染色.如果碰到了奇环,就直接输出"NO",否则就对该图奇偶染色,进行地定向.$col[u]$表示以$u$为起点的边所染的颜色. #include <bits/s

【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,那都是不符合

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') {