[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 }
对不起啊,因为我是一个活在二次元的人,生为野犬,喻世,勿争了吧。