Codeforces Round #518 (Div. 2)C. Colored Rooks(模擬)
阿新 • • 發佈:2018-11-01
題意
給出n個顏色種類,m種顏色關係,要求在
的方格中正確擺放這些顏色,每種顏色的個數不限。然後按順序輸出每種顏色的個數和所放的座標。
要滿足三個條件:
- 對於每種顏色,必須要有一個。
- 每種顏色都必須相連。
- 對於有關係的顏色必須相連,沒關係的不能相連。
相連的定義是: 不同種類的顏色,只要在同一行或者同一列,就叫做相連。
題解
這題的答案不唯一,有一個簡單的方法就是每個顏色分配一行,然後有關係的就在同一列上加顏色,一直順次往後。
例如和1有關係的顏色是2,3,4。
和2有關係的顏色是2,4。
和3有關係的顏色是4。
程式碼
#include <bits/stdc++.h>
using namespace std;
int G[105][105];
int p,n,m;
struct node {
int x,y;
};
vector<node> v[105];
void solve() {
for(int i = 1; i <= n; ++i) {
v[i].push_back((node){i,p});
p++;
for(int j = i+1; j <= n; ++j) {
if(G[i][j]) {
v[i].push_back(( node){i,p});
v[j].push_back((node){j,p});
p++;
}
}
}
}
int main() {
cin >> n >> m;
p = 1;
for(int i = 0; i < m; ++i) {
int u,v;
cin >> u >> v;
G[u][v] = G[v][u] = 1;
}
solve();
for(int i = 1; i <= n; ++i) {
cout << v[i].size() << endl;
for(int j = 0; j < v[i].size(); ++j) {
cout << v[i][j].x <<" " << v[i][j].y << endl;
}
}
return 0;
}