Flag Day
Descriptions
小G请你对 n 个点进行染色,可选的颜色有三种:白、红、蓝,并使得给定的 m 个三元组中,每个点的颜色各不相同。
因为你可能不会三分图匹配,于是小G给出了更多的特殊条件:
- 每个点在三元组中至少出现一次,至多出现两次。
- 第 i 个(i ≥ 2)三元组中,至多有一个点在第 1 个到第 i-1 个三元组中出现过。
虽然这题现在已经很水了,但是小G为了照顾萌新,你只要输出其中任意一种方案即可。
Input
输入格式如下:
n m
a1 b1 c1
a2 b2 c2
…
am bm cm
其中, ai,bi,ci 表示一个三元组,其中的元素为第 ai,bi,ci 个点。
Output
输出格式如下:
c1 c2 … cn
其中, ci 表示第 i 个点的颜色, 1 表示白色, 2 表示红色, 3 表示蓝色。
Examples
Input7 3
1 2 3
1 4 5
4 6 7
Output1 2 3 3 2 2 1Input9 3
3 6 9
2 5 8
1 4 7Output1 1 1 2 2 2 3 3 3Input5 2
4 1 5
3 1 2
Output2 3 1 1 3
题目链接
题意
同一行三个数字代表编号,例
5 24 1 53 1 2
4号 1号 5号
3号 1号 2号
最后输出结果 1号 2号 3号 4号 5号
分别为 2 3 1 1 3
4号 1号 5号
3号 1号 2号
分别对应 1 2 3
1 2 3
即每一行都是这三个数字 不能重复,不能缺少
AC代码
#include <iostream>
#include <cstdio>
#include <fstream>
#include <algorithm>
#include <cmath>
#include <deque>
#include <vector>
#include <queue>
#include <string>
#include <cstring>
#include <map>
#include <stack>
#include <set>
#include <sstream>
#define IOS ios_base::sync_with_stdio(0); cin.tie(0);
#define Mod 1000000007
#define eps 1e-6
#define ll long long
#define INF 0x3f3f3f3f
#define MEM(x,y) memset(x,y,sizeof(x))
#define Maxn 100005
using namespace std;
int n,m;
int color[Maxn];
int a[3];
int main()
{
cin>>n>>m;
MEM(color,0);
for(int i=0; i<m; i++)
{
cin>>a[0]>>a[1]>>a[2];
if(i==0)
{
color[a[0]]=1;
color[a[1]]=2;
color[a[2]]=3;
}
else
{
if(color[a[0]]!=0)
{
color[a[1]]=(color[a[0]]+1);
color[a[2]]=(color[a[0]]+2);
if(color[a[1]]>3)
color[a[1]]-=3;
if(color[a[2]]>3)
color[a[2]]-=3;
}
else if(color[a[1]]!=0)
{
color[a[0]]=(color[a[1]]+1);
color[a[2]]=(color[a[1]]+2);
if(color[a[0]]>3)
color[a[0]]-=3;
if(color[a[2]]>3)
color[a[2]]-=3;
}
else if(color[a[2]]!=0)
{
color[a[0]]=(color[a[2]]+1);
color[a[1]]=(color[a[2]]+2);
if(color[a[0]]>3)
color[a[0]]-=3;
if(color[a[1]]>3)
color[a[1]]-=3;
}
else
{
color[a[0]]=1;
color[a[1]]=2;
color[a[2]]=3;
}
}
}
for(int i=1;i<=n;i++)
cout<<color[i]<<" ";
return 0;
}
解决FlagDay问题,通过染色算法确保每个三元组内的节点颜色不同,满足特定约束条件,输出任意可行方案。
452

被折叠的 条评论
为什么被折叠?



