【Henu ACM Round#16 C】Graph and String
阿新 • • 發佈:2018-01-26
bool http fin clas const post sin ces log
而根據【規則2】可知點k只能為a
【鏈接】 我是鏈接,點我呀:)
【題意】
在這裏輸入題意
【題解】
根據題意:先明確以下規則:
1.如果兩個點之間沒有邊,那麽這兩個點只能是a或c,且不能相同
2.如果兩個點之間有邊,那麽他們之間的差的絕對值<=1
那麽對於點i,如果它和所有的點都相連了,那麽就幹脆把他變成b.
這樣其他點無論選什麽都和它沒有關系,其他點選什麽都可以了
接下裏,找到任意一個點j,且點j沒有和所有的點相連。
顯然這個點只能為a或c,因為它和某個點之間沒有邊。【規則1】
那麽我們就讓這個點j設置為a;
①然後對於和j相連的所有點k,且點k不為b(即k不與其他所有點相連),那麽點k
只能為a或c(因為k和某個點之間沒有邊)【規則1】
②對於和j不相連的所有點k,顯然k只能為c
根據①和②
會發現所有的點都已經染上色了
而點j為a或c其實不影響答案。
所以再O(n^2)根據規則判斷一下這個染色是否可行就好了。
【代碼】
#include <bits/stdc++.h>
using namespace std;
const int N = 500+10;
int c[N],n,m,chu[N+10];
bool b[N][N];
int main()
{
ios::sync_with_stdio(0),cin.tie(0);
#ifdef LOCAL_DEFINE
freopen("rush.txt" ,"r",stdin);
#endif
cin >> n >> m;
for (int i = 1;i <= m;i++){
int x,y;
cin >> x >> y;
b[x][y] = b[y][x] = true;
chu[x]++;chu[y]++;
}
for (int i = 1;i <= n;i++)
if (chu[i]==(n-1))
c[i] = 2 ;
for (int i = 1;i <= n;i++)
if (c[i]!=2){
c[i] = 1;
for (int j = 1;j <= n;j++)
if (b[i][j] && c[j]!=2){
c[j] = 1;
}else if (i!=j && !b[i][j]){
c[j] = 3;
}
break;
}
for (int i = 1;i <= n;i++)
for (int j = 1;j <= n;j++)
if (b[i][j]){
if (abs(c[i]-c[j])>1) return cout<<"No"<<endl,0;
}else if (i!=j){
if (abs(c[i]-c[j])<=1) return cout<<"No"<<endl,0;
}
cout<<"Yes"<<endl;
for (int i = 1;i <= n;i++){
if (c[i]==1) cout<<'a';
if (c[i]==2) cout<<'b';
if (c[i]==3) cout<<'c';
}
return 0;
}
【Henu ACM Round#16 C】Graph and String