Codeforces AIM Tech Round (Div. 1) A Graph and String 想法

markdown不能用,我也是****。

题意:图上所有点都是由‘a’,.'b','c'组成,如果两个点是连通的,这两点点是相同的或者在字母表中连续,‘a’-'b','b'-'c'这种都是连通的例子。图上有n个点,现在给出一些连通关系,问是否可能存在这样的图,如果存在,输出任意一个图。

思路:根据条件,如果有一个点跟图上所有点都是连通的,我们就可以把这个点设为‘b’,因为‘b’-'a','b'-'b','b'-'c'都是连通的。首先我们把图上这种和所有点都连通的点去掉,剩下的图变成了几个块,块数不能超过两个,(想想就可以得到)而且每个块必须是强连通的,(也就是这个块中所有点都是两两相连的)。如果有两个块,一个块所有点设为‘a’,另一个块所有点设为‘c’。

http://codeforces.com/contest/623/problem/A

/*********************************************
    Problem : AIM Tech Round#1 A
    Author  : NMfloat
    InkTime (c) NM . All Rights Reserved .
********************************************/

#include <map>
#include <set>
#include <queue>
#include <stack>
#include <cmath>
#include <ctime>
#include <cstdio>
#include <cstring>
#include <cstdlib>
#include <iostream>
#include <algorithm>

#define rep(i,a,b)  for(int i = (a) ; i <= (b) ; i ++) //遍历
#define rrep(i,a,b) for(int i = (b) ; i >= (a) ; i --) //反向遍历
#define repS(it,p) for(auto it = p.begin() ; it != p.end() ; it ++) //遍历一个STL容器
#define repE(p,u) for(Edge * p = G[u].first ; p ; p = p -> next) //遍历u所连接的点
#define cls(a,x)   memset(a,x,sizeof(a))
#define eps 1e-8

using namespace std;

const int MOD = 1e9+7;
const int INF = 0x3f3f3f3f;
const int MAXN = 1e5+5;
const int MAXE = 2e5+5;

typedef long long LL;
typedef unsigned long long ULL;

int T,n,m;

int fx[] = {0,1,-1,0,0};
int fy[] = {0,0,0,-1,1};

bool M[505][505];
bool vis[505];
int totnum ;
int ok ;//Yes or No
char ans[505];

void input() {
    int u,v;
    cls(M,0);
    rep(i,1,m) {
        scanf("%d %d",&u,&v);
        M[u][v] = true; M[v][u] = true; //双向边
    }  
}

bool All_link(int u) {
    int cnt = 0;
    rep(i,1,n) {
        cnt += M[u][i]; //代表和多少个点相连
    }
    if(cnt == totnum) {
        ans[u] = 'b'; vis[u] = true;
        rep(i,1,n) M[u][i] = M[i][u] = false;
        totnum --;
    }
}

void move_link(int u,char ch) {
    int link_num = 0;
    rep(i,1,n) link_num += M[u][i];
    rep(i,1,n) {
        if(M[u][i]) {
            int tmp = 0;
            rep(j,1,n) {
                tmp += M[i][j];
                M[i][j] = false;
            }
            if(tmp != link_num) { ok = 1; return ;}
            vis[i] = true;
            ans[i] = ch;
        }
        M[u][i] = false;
    }
    ans[u] = ch;
}

void find_group() {
    int cnt = 0;
    rep(i,1,n) {
        if(!vis[i]) {
            cnt ++;
            if(cnt == 1)move_link(i,'a');//删除i所在这一个集合所有的边,并且判断是不是强连通的
            else if(cnt == 2)move_link(i,'c');
            else if(cnt == 3) ok = 1;
            if(ok) return;
        }
    }
}

void solve() {
    totnum = n - 1;
    cls(vis,0);
    rep(i,1,n) All_link(i);
    //剩下的点不能多于两个集团。这一个集团必须是强连通的。
    ok = 0;
    find_group();
    if(ok) puts("No");
    else {
        puts("Yes");
        rep(i,1,n) putchar(ans[i]);
        putchar('\n');
    }
}

int main(void) {
   // freopen("a.in","r",stdin);
    while(~scanf("%d %d",&n,&m)) {
        input();
        solve();
    }
    return 0;
}


1、资源项目源码均已通过严格测试验证,保证能够正常运行; 2、项目问题、技术讨论,可以给博主私信或留言,博主看到后会第一时间与您进行沟通; 3、本项目比较适合计算机领域相关的毕业设计课题、课程作业等使用,尤其对于人工智能、计算机科学与技术等相关专业,更为适合; 4、下载使用后,可先查看rEADME.md或论文文件(如有),本项目仅用作交流学习参考,请切勿用于商业用途。 5、资源来自互联网采集,如有侵权,私聊博主删除。 6、可私信博主看论文后选择购买源代码。 1、资源项目源码均已通过严格测试验证,保证能够正常运行; 2、项目问题、技术讨论,可以给博主私信或留言,博主看到后会第一时间与您进行沟通; 3、本项目比较适合计算机领域相关的毕业设计课题、课程作业等使用,尤其对于人工智能、计算机科学与技术等相关专业,更为适合; 4、下载使用后,可先查看rEADME.md或论文文件(如有),本项目仅用作交流学习参考,请切勿用于商业用途。 5、资源来自互联网采集,如有侵权,私聊博主删除。 6、可私信博主看论文后选择购买源代码。 1、资源项目源码均已通过严格测试验证,保证能够正常运行; 2、项目问题、技术讨论,可以给博主私信或留言,博主看到后会第一时间与您进行沟通; 3、本项目比较适合计算机领域相关的毕业设计课题、课程作业等使用,尤其对于人工智能、计算机科学与技术等相关专业,更为适合; 4、下载使用后,可先查看README.md或论文文件(如有),本项目仅用作交流学习参考,请切勿用于商业用途。 5、资源来自互联网采集,如有侵权,私聊博主删除。 6、可私信博主看论文后选择购买源代码。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值