喵哈哈村的星星与月亮(二)-(暴力DFS)

    xiaoxiao2021-03-25  54

    喵哈哈村的星星与月亮(二)

    发布时间: 2017年4月4日 20:22   最后更新: 2017年4月4日 20:23   时间限制: 1000ms   内存限制: 128M

    描述

    喵哈哈村最近生活的很平静,于是月亮同学就决定出一道题给星星同学玩:

    上周月亮同学偷偷的去看了《嫌疑人X的献身》这部电影,其中的男主角就整天抱着四色问题这本书,现在月亮同学就准备考考很蠢的星星同学。

    给出一个平面图,这个图由n个点,m条无向边组成。

    现在你需要对每个点染色,使得每一个边相连的点的颜色都不一样。

    请问最少使用多少个颜色。

    输入

    本题包含若干组测试数据。 第一行两个整数n,m,表示点数和边数。保证无重边,无自环。 满足 1<=n<=10,0<=m<=n*(n-1)/2

    输出

    输出最少颜色数量

    样例输入1  复制 3 3 1 2 2 3 1 3 样例输出1 3 查看隐藏信息 选择语言

     C (GCC 4.8)  C++ (G++ 4.3)  Java (Oracle JDK 1.7)

      典型搜索,n=10,所以直接枚举每一点所染的颜色即可

    #include <stdio.h> #include <string.h> #include <stdlib.h> #include<vector> #include<algorithm> using namespace std; typedef long long ll; #define maxn 15 int a[maxn][maxn],b[maxn];//b数组存放点i所染的颜色 int n,m,flag; void dfs(int x,int y) { if(flag) return; if(x==n+1) { flag=1; return; } for(int i=1;i<=min(x,y);i++) { b[x]=i; int mark=0; for(int j=1;j<x;j++) if(a[j][x] && b[x]==b[j]) { mark=1; break; } if(mark==0) dfs(x+1,y); } } int main(void) { int i,x,y; while(scanf("%d%d",&n,&m)!=EOF) { memset(a,0,sizeof(a)); for(i=1;i<=m;i++) { scanf("%d%d",&x,&y); a[x][y]=1; a[y][x]=1; } for(i=1;i<=n;i++) { flag=0; dfs(1,i); if(flag) { printf("%d\n",i); break; } } } return 0; }

      

    转载请注明原文地址: https://ju.6miu.com/read-40903.html

    最新回复(0)