DFS搜尋 剪枝

2021-08-09 12:15:10 字數 1468 閱讀 8745

hdu-5952

題意:給出一張無向圖,然後判斷這張圖中一共有多少個不同的大小為s的完全圖(完全圖的頂點數為s個),題目保證每個點的度不大於20。

完全圖:n個點兩兩之間都有一條邊的圖叫完全圖。

思路:由於頂點個數很少,而且每個點的度數最多是20,所以可以暴力優化,建圖,對於每個s點完全子圖,如果i點在子圖中,那麼就列舉與i有邊的其他點,(意思就是列舉完全圖裡面有i點的那些完全圖,既然i點在完全圖中,那麼完全圖中的別的點只能是i點集合裡面的點,所以搜尋所有i點集合裡面的點),每加入乙個點,就判斷一下是否和其他已加入的點有邊,如果是就可以加入,否則不能加。

有一點需要注意的是,如果已經搜尋完全部的與i點有關的完全圖,那麼接下來要搜尋的完全圖裡面一定不會再包含i點,所以要把與i點有關的邊都刪去,不然就會重複搜尋完全圖了,這裡就是乙個優化點。

**:

#include 

#include

#include

#include

#include

#include

#include

#include

#include

#include

#include

#include

#define ri(n) scanf("%d",&n)

#define oi(n) printf("%d\n",n)

#define rl(n) scanf("%lld",&n)

#define ol(n) printf("%lld\n",n)

#define rep(i,l,r) for(i=l;i<=r;i++)

#define rep1(i,l,r) for(i=l;iusing

namespace

std;

typedef

long

long ll;

const

int inf=0x3f3f3f3f;

const

int epg=10-8;

int check[1000+10];

vector

g[100+10];

int e[100+10][100+10];

int ans,cnt;

int n,m,s;

int ok(int u)

return1;}

void dfs(int u,int id)

if(g[u].size()-id=g[u].size())

return ;

if(ok(g[u][id]))

dfs(u,id+1);

}int main()

ans=0;

for(int i=1; i<=n; i++)

}printf("%d\n",ans);

}return

0;}

搜尋剪枝DFS

tempter of the bone hdu1010 題意 給乙個圖,找出乙個看能否能在t的時間內從s到達d點 思路 bfs肯定不行,因為bfs找到的是最短時間的路徑,無法對在t時間點到達d點進行判斷 於是才想到了dfs,這個能把所有的情況遍歷一遍的演算法,雖然圖的長寬只有7,但是總是超時,這次終...

dfs搜尋剪枝技巧

1.當前搜到的東西劣於答案,或者當前搜到的加上之後能取到最最最優的 估價 依然劣於答案,return 2.對於第1點可以在搜前先估乙個答案上界 3.按一定順序列舉,如從小到大或從大到小,減少相同狀態 4.對第3點,在一大部分題裡從大到小枚更好,因為能更快得到乙個答案用於剪掉後面的 5.每層列舉時可判...

UVA 11882 dfs搜尋 bfs剪枝

uva 11882 dfs搜尋 bfs剪枝 給你乙個r c的數字矩陣,要求從任意乙個點開始走,只能上下左右走,求走的過數連線起來最大是多少。直接dfs每乙個數字,在每一層dfs中,加上bfs 判斷剩下的數連線起來能否大於當前的ans 不能的話 剪枝了。雖然思路是這樣的,但昨天一直tle,或許姿勢不對...