AIM Tech Round (Div. 2)C - Graph and String(二分图染色)
2016-02-05 16:44
549 查看
题意:
代码:
[code]赛上没想出解法,赛后虽然讨论了出来,却发现有一个神trick,也就是这题 是肯定会挂的QAQ。 题意我就不多说了,读题就懂,我就说这题怎么转化的。 首先,根据题意,那么只有a和c是不会连边的,也就是说,没有连的边就是 一个a,一个c,那么我们就可以反过来建图,用没连的边来建一个图,那么 这个图是不是每一条边的两个节点一定是不同的染色,这不就是典型的二分 图染色么?想到这里肯定是很激动的,于是就去写了,然后wa26,没错,就 是这个神trick。为何会出现这个问题,因为你根据没有的边建图,并不能 保证他不会和其他的边相连,你把这个样例模拟一下会发现,你跑出来的结果 了一条边,所以说我们必须在找到一个可行解后,依照规则再次检查是否符合 题目给我们的图,就可以了。
代码:
[code]// // Created by CQU_CST_WuErli // Copyright (c) 2015 CQU_CST_WuErli. All rights reserved. // // #include<bits/stdc++.h> #include <iostream> #include <cstring> #include <cstdio> #include <cstdlib> #include <cctype> #include <cmath> #include <string> #include <vector> #include <list> #include <map> #include <queue> #include <stack> #include <set> #include <algorithm> #include <sstream> #define CLR(x) memset(x,0,sizeof(x)) #define OFF(x) memset(x,-1,sizeof(x)) #define MEM(x,a) memset((x),(a),sizeof(x)) #define For_UVa if (kase!=1) cout << endl #define BUG cout << "I am here" << endl #define lookln(x) cout << #x << "=" << x << endl #define SI(a) scanf("%d",&a) #define SII(a,b) scanf("%d%d",&a,&b) #define SIII(a,b,c) scanf("%d%d%d",&a,&b,&c) #define rep(flag,start,end) for(int flag=start;flag<=end;flag++) #define Rep(flag,start,end) for(int flag=start;flag>=end;flag--) #define Lson l,mid,rt<<1 #define Rson mid+1,r,rt<<1|1 #define Root 1,n,1 #define BigInteger bign template <typename T> T gcd(const T& a,const T& b) {return b==0?a:gcd(b,a%b);} const int MAX_L=2005;// For BigInteger const int INF_INT=0x3f3f3f3f; const long long INF_LL=0x7fffffff; const int MOD=1e9+7; const double eps=1e-9; const double pi=acos(-1); typedef long long ll; using namespace std; int n,m; int mp[550][550]; int vis[550]; vector<int> g[550]; int col[550]; char s[550]; bool dfs(int u,int c) { col[u]=c; for (int i=0;i<g[u].size();i++) { int v=g[u][i]; if (!col[v]) { if (!dfs(v,-c)) return false; } else if (col[v]==col[u]) return false; } return true; } int main(){ #ifdef LOCAL freopen("C:\\Users\\john\\Desktop\\in.txt","r",stdin); // freopen("C:\\Users\\john\\Desktop\\out.txt","w",stdout); #endif while (SII(n,m)==2) { CLR(mp); rep(i,0,n) g[i].clear(); rep(i,1,m) { int u,v; SII(u,v); mp[u][v]=mp[v][u]=1; } CLR(vis); rep(i,1,n) rep(j,i+1,n) if (!mp[i][j]) { g[i].push_back(j); g[j].push_back(i); vis[i]=vis[j]=1; } CLR(col); int flag=1; rep (i,1,n) if (vis[i] && !col[i]) { if (!dfs(i,1)) { flag=0;break; } } CLR(col); rep(i,1,n) if (vis[i] && !col[i]) { if (!dfs(i,-1)) { flag=0;break; } } if (!flag) puts("No"); else { rep(i,1,n) { if (!vis[i]) s[i]='b'; else if (col[i]==1) s[i]='a'; else s[i]='c'; } rep(i,1,n) rep(j,1,n) if (i!=j) { if (abs(s[i]-s[j])<=1 && !mp[i][j]) { flag=0;break; } if (abs(s[i]-s[j])>1 && mp[i][j]) { flag=0;break; } } if (!flag) puts("No"); else { puts("Yes"); for (int i=1;i<=n;i++) cout << s[i]; cout << endl; } } } return 0; }
相关文章推荐
- gmail如何设置邮箱别名
- Codeforces AIM Tech Round (Div. 1) ABD
- Codeforces AIM Tech Round (Div. 1) A Graph and String 想法
- AIM Tech Round (Div. 2) D. Array GCD dp
- poj 3007 Organize Your Train part II(字符串哈希)
- symfony2 服务容器(Service Container)
- AIM Tech Round (Div. 2) C. Graph and String 二分图染色
- AIM Tech Round (Div. 2) B. Making a String 贪心
- AIM Tech Round (Div. 2)(B)模拟
- AIM Tech Round (Div. 2) A. Save Luke 水题
- AIM Tech Round (Div. 2)(A)数学
- AIM Tech Round (Div. 2)-B. Making a String(贪心)
- AIM Tech Round (Div. 2)-A. Save Luke(数学题)
- 人工智能、应用、程序
- 【slighttpd】基于lighttpd架构的Server项目实战(5)—TCP的TIME_WAIT状态
- ubuntu sendmail
- AIM Tech Round (Div. 2)
- Codeforces AIM Tech Round (Div. 2) B. Making a String
- Codeforces AIM Tech Round (Div. 2) A. Save Luke
- 行链接(Row chaining) 与行迁移(Row Migration)