[Jsoi2015] 种花

 

题面:

刚看到这题以为是个4分图染色,求染色数,想着是个神奇的什么鬼算法???

觉得应该是个数论

然后转眼看了看这及其之水的数据。。。。

DFS我来了qwq

思路很简单,枚举每个点的每种颜色,若四种颜色还有没染的就染上,

染完回溯,ans++,然后枚举下一种情况,

然后这题就结束了。

 1 #include<iostream>
 2 #include<cstdio>
 3 #include<cmath>
 4 #include<list>
 5 #include<map>
 6 #include<queue>
 7 #include<set>
 8 #include<stack>
 9 #include<cstring>
10 #include<vector>
11 
12 using namespace std;
13 
14 inline int read()
15 {
16     int x=0,f=1;
17     char ch=getchar();
18     while(ch<'0'||ch>'9')
19     {
20         if(ch=='-')
21             f=-1;
22         ch=getchar();
23     }
24     while(ch>='0'&&ch<='9')
25     {
26         x=(x<<1)+(x<<3)+(ch^48);//x=x*10+ch-'0';
27         ch=getchar();
28     }
29     return x*f;
30 }
31 
32 inline void print(int x)
33 {
34     if(x<0) 
35     x=-x,putchar('-');
36     if(x>9) 
37     print(x/10);
38     putchar(x%10+'0');
39 }
40 
41 bool adj[11][11];
42 int n,m,ans,col[11];
43 
44 bool can_color(int x,int color)
45 {
46     for(int i=1;i<=n;i++)
47     {
48         if(i==x)
49         continue;
50         if(!adj[i][x])
51         continue;
52         if(col[i]==color)
53         return false;
54     }
55     return true;
56 }
57 
58 void dfs(int x)
59 {
60     if(x>n)
61     {
62         ans++;
63         return;
64     }
65     for(int i=1;i<=4;i++)
66     {
67         if(can_color(x,i))
68         {
69             col[x]=i;
70             dfs(x+1);
71             col[x]=0;
72         }
73     }
74 }
75 
76 int main()
77 {
78     //freopen("colour.in","r",stdin);
79     //freopen("colour.out","w",stdout);
80 
81     n=read();
82     m=read();
83     for(int i=1;i<=m;i++)
84     {
85         int x=read(),y=read();
86         adj[x][y]=adj[y][x]=1;
87     }
88     dfs(1);
89     print(ans);
90     
91     //fclose(stdin);
92     //fclose(stdout);
93     return 0;
94 }
by YLCH

 

posted @ 2019-11-13 08:04  樱洛CHANGE  阅读(197)  评论(0编辑  收藏  举报