标签:
给出一个图, 每个节点只有三种情况, 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; }
codeforces 623A. Graph and String 构造
标签:
原文地址:http://www.cnblogs.com/yohaha/p/5204323.html