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

题目链接

题意

给出n个颜色种类,m种颜色关系,要求在 1 0 9 × 1 0 9 10^9 \times 10^9 109×109的方格中正确摆放这些颜色,每种颜色的个数不限。然后按顺序输出每种颜色的个数和所放的坐标。
要满足三个条件:

  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;
}
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值