1154 Vertex Coloring (25 分)
原题链接
- 大致题意
- 思路
- AC代码
1.大致题意
图的着色问题
一个合格的图着色是指图中任意同一条边的两个顶点不能同样的颜色;图中颜色总数为k的方案称为k-着色问题。
例如:(自己加的,不是题目中给的图,google搜的)
如上述右图,任意同一条边的两个顶点颜色都不相同,且图中共用了4种颜色,所以是一个4-着色方案。
2.思路:
建图,遍历整个图,看是否存在同一条边顶点颜色相同的情况,再统计一下颜色的种类。
分析:把所有边存起来,把所有点的颜⾊存起来(存的过程中放⼊set统计颜⾊个数),枚举所有边,检查是否每条边的两点个颜⾊是否相同,若全不相同,则输出颜⾊个数,否则输出No~
3.AC代码
#include<bits/stdc++.h>
using namespace std;
const int maxn=1e5+10;
struct node
{
//一条边的两个端点
int t1,t2;
};
int main()
{
#ifdef ONLINE_JUDGE
#else
{
freopen("2.txt","r",stdin);
}
#endif
int n,m,k;
cin>>n>>m;
vector<node>v(m);
for(int i=0;i<m;i++)
{
scanf("%d %d",&v[i].t1,&v[i].t2);
}
cin>>k;
while(k--)
{
//将颜色放入set方便统计数量
set<int>st;
int a[10009]={0};
for(int i=0;i<n;i++)
{
scanf("%d",&a[i]);
st.insert(a[i]);
}
bool flag=1;
for(int i=0;i<m;i++)
{
//如果左边的颜色等于右边的颜色,说明不符合
if(a[v[i].t1]==a[v[i].t2])
{
flag=0;
break;
}
}
int num=st.size();
if(flag==0) printf("No\n");
else printf("%d-coloring\n",num);
}
return 0;
}
喵~