1. 程式人生 > >Codeforces Round #518 (Div. 2)C. Colored Rooks(模擬)

Codeforces Round #518 (Div. 2)C. Colored Rooks(模擬)

題目連結

題意

給出n個顏色種類,m種顏色關係,要求在 1 0 9 × 1 0 9

10^9 \times 10^9 的方格中正確擺放這些顏色,每種顏色的個數不限。然後按順序輸出每種顏色的個數和所放的座標。
要滿足三個條件:

  1. 對於每種顏色,必須要有一個。
  2. 每種顏色都必須相連。
  3. 對於有關係的顏色必須相連,沒關係的不能相連。

相連的定義是: 不同種類的顏色,只要在同一行或者同一列,就叫做相連。

題解

這題的答案不唯一,有一個簡單的方法就是每個顏色分配一行,然後有關係的就在同一列上加顏色,一直順次往後。

例如和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; }