古往今來的各種傳說中存在著很多魔法陣,它們的啟用方式也各不相同。傳說在北師大電子樓前的小花園裡就有乙個魔法陣,上次出現還是在很多很多很多年前,但是現在它又出現了!
這時,小q同學面無表情地說:「傳說這個魔法陣都會在都會在來自遠古的惡魔awesome crystal monster(acm)降臨的時候出現,現在,這個時候終於要到來了嗎!」話音未落,小q同學已經走到了魔法陣前,取出乙個小瓶,開始用瓶中的聖水啟用這個魔法陣,「你們快退後,這裡就交給我了!」
這個魔法陣由一些點和一些連線這些點的邊構成,當小q同學把聖水滴在乙個點上時,和這個點相連的所有邊就會被點亮並發出神聖的光芒,當魔法陣所有的邊都點亮的時候,就會出現強大的神聖力量。但是小q同學擁有的聖水非常有限,只有10滴,現在小q同學想知道他最少可以用多少滴聖水點亮整個魔法陣,如果耗盡聖水也不能點亮,就只能打出一波gg了。
第一行包含乙個正整數t(≤ 20),表示測試資料的組數,對於每組測試資料,
第一行是兩個整數n(1 ≤ n ≤ 1000)和m(1 ≤ m ≤ 2000),表示魔法陣的點數和邊數,
接下來m行,每行包含兩個整數u,v(1 ≤ u,v ≤ n),表示有一條邊連線了u號點和v號點。
對於每組測試資料,如果使用不超過10滴聖水可以點亮整個魔法陣,輸出最少需要的聖水滴數,否則輸出"gg"(不含引號)。示例1
24 31 2
1 31 4
4 41 2
2 33 4
4 1
12
對於第一組樣例,最優方案是在1號點滴一滴聖水,對於第二組樣例,乙個最優方案是在1號點和3號點各滴一滴聖水。
題目思路:
一開始寫了乙個毫無證明的貪心,順了wa了,我們從資料來看只有10,所以應該跟暴力有關係,但是怎麼去暴力呢,對於這個來說
我們容易想到去列舉點的子集,但是n有1000,那麼複雜度有2^1000*m ,顯然不行,我們分析可以發現,對於每一條邊,他的兩個頂點一定是有至少乙個被染色了的,所以我們可以去考慮每一條邊,對於當前邊如果有至少乙個頂點被染色,那麼就去繼續遍歷,否則就去回溯哪乙個頂點被染色了,如果深度超過10直接就退出,複雜度是2^10*m
這題的關鍵點就是發現對於一條邊來說,肯定要有乙個頂點被染色,這樣我們就能繼而想到列舉邊,根據邊的情況分析。
ac**:
#include#include#include#include#include#include#include#include#define ll long long
#define inf 0x3f3f3f3f
#define llinf 0x3f3f3f3f3f3f3f
#define lson rt<<1
#define rson rt<<1|1
using namespace std;
int t;
int n,m;
struct node
e[2000+5];
int vis[1000+5];
int ans = inf;
void dfs(int sum,int deep)
if(sum==m)
if(vis[e[sum].u]||vis[e[sum].v])
else
}int main()
{ scanf("%d",&t);
while(t--){
ans = inf;
scanf("%d%d",&n,&m);
memset(vis,0,sizeof(vis));
for(int i = 0;i
HDU 5765 Bonds 巧妙狀壓暴力
題意 給乙個20個點無向連通圖,求每條邊被多少個極小割集包括 然後就是奉上官方題解 2016多校訓練第4場1003 其實大體思路就是每次列舉一種可能的割集,即狀壓列舉,其中有不合法的,可以通過預處理標記所有的合法狀態 剩下的就是貼 了,好好看 細節才是最重要的 include include inc...
巧妙使用std mem fun
例如 假設有如下的 class employee std vectoremps 假設我們要呼叫emps裡面所包含的所有employee的dosomething 一般初學者會這樣呼叫 for std vector iteror it emps.begin it emps.ends it 而定義乙個全域...
clear both巧妙解答
divstyle border 2 px solid red divstyle float left width 80 px height 80 px border 1 px solid blue test div div divstyle float left width 90 px height...