題意:有n個人(n<=8),每個人有一定數量的朋友,而和朋友的關係是線上朋友或者線下朋友(只能是其中一種)。問每個人的線上朋友數量都等於線下朋友數量的方法數有多少。
做法:建成乙個圖,如果邊的數目是奇數或者有人的度數是奇數,那個方法數肯定是0。否則,我們可以將邊進行染色。假設黑色代表兩個人之間是線上朋友,白色代表兩個人之間是線下朋友。那麼要滿足條件,必須全部邊有一半被染色,並且對於每個人相連的邊有一半被染色。我們可以取一半的邊進行染色,然後判斷是不是每個人的一半相鄰邊被染色。這樣,耗時為c(14,28)。加上一些情況的剪枝,就能順利通過!
#pragma comment(linker, "/stack:1024000000,1024000000")
#include#include#include#include#include#include#include#include#includeusing namespace std;
struct edge
edge(){}
};vectorvec;
int ans;
int n,m;
int deg[9],online[9];//online[i]代表乙個人的線上朋友數量,即相連邊的染色數量
bool judge()
} return flag;
}void dfs(int pre,int num)
if(pre==m) return;
int cur=pre+1;
dfs(cur,num);//這條邊不染色
int u=vec[cur-1].u;
int v=vec[cur-1].v;
if(online[u]+1>deg[u]/2||online[v]+1>deg[v]/2) return ;
online[u]++;
online[v]++;
dfs(cur,num+1);//這條邊進行染色
online[u]--;
online[v]--;
}bool judge1()
return true;
}int main()
if(m%2==1)
if(judge1()==false)
ans=0;
dfs(0,0);
printf("%d\n",ans);
}}
暴力搜尋(HDU 5305,Friends)
hdu 5305,friends 1 n 8,這個範圍的資料不僅可以考慮位壓縮更可以階乘級別的暴力列舉或搜尋了。本題主要和邊有關,所以點位壓縮沒什麼好方法,邊位壓縮也沒什麼意義,而且邊是o n 2 級別的也不可能壓。那就考慮列舉,首先要思考最壞情況有多少種答案,粗略算一下,發現頂多也就c 8,4 c...
HDU1175 搜尋 剪枝
題目鏈結 連連看 題目大意 給一張n m大小的圖,問查詢的兩個點k1與k2之間能不能消掉,消掉的條件是通過走沒有東西的路徑拐彎不超過兩次到達目標點。0表示沒有東西,1的物品表示相應的東西 並且不能夠走外圍。解題思路 從起點向終點搜尋可行解,有乙個重要的剪枝是 當無轉彎的次數時,還沒到達與終點相同的行...
hdu 5113(2014北京 搜尋 剪枝)
題意 有n m的棋盤,用k種顏色去染,要求相鄰塊不能同色。已知每種顏色要染的塊數,問能不能染,如果能,輸出任一種染法。最開始dfs失敗了 優先搜尋一行,搜完後進入下一列,超時。本來以為搜尋不行,看別人給的思路就是搜尋 剪枝。但是一直不知道該怎麼剪,看了解題報告才發現,剩下的格仔的數量 1必需是剩餘最...