解題思路: 先我們考慮從源點出發到所有自己想要經過的點然後在回到源點sum,顯然每條邊都必須經過源點(這個我們可以一次dfs求出),但題目的意思是可以不用回到源點,那麼我們可以再求源點到所有要經過的點的最遠距離ans,於是答案便是sum-ans.
這道題的思路確實是很巧妙,一開始我還是在想如何表示從某一點回來的狀態,資料太大用狀態壓縮肯定不行,結果就沒思路了,看了別人的思路確實是抓住了這道題的精髓。。。
#include#include#includeusing namespace std;
const int maxn = 50005;
struct edge
edge[maxn<<1];
int n,m,k,pre[maxn],dis[maxn],cnt,sum;
bool vis[maxn];
void addedge(int u,int v,int w)
void dfs(int u,int f) }}
int main()
scanf("%d",&m);
while(m--)
sum = 0; dis[k] = 0; m = 0;
dfs(k,-1);
for(int i = 1; i <= n; i++)
printf("%d\n",sum - m);
} return 0;
}
暴力搜尋 回溯法
回溯法 backtracking 是深度優先搜尋 dfs 的一種,按照深度優先的順序便利解答樹。應用範圍很廣,只要能把待求解的問題分成不太多的步驟,每個步驟又只有不太多的選擇,都可以考慮應用回溯法。在學習回溯法之前,一定要保證遞迴程式能熟練準確地寫出。當把問題分成若干步驟並遞迴求解時,如果當前步驟沒...
搜尋回溯問題 滑動視窗
參考鏈結,有八皇后問題 如迷宮問題 進入迷宮後,先隨意選擇乙個前進方向,一步步向前試探前進,如果碰到死胡同,說明前進方向已無路可走,這時,首先看其它方向是否還有路可走,如果有路可走,則沿該方向再向前試探 如果已無路可走,則返回一步,再看其它方向是否還有路可走 如果有路可走,則沿該方向再向前試探。按此...
2021 3 1 79 單詞搜尋 回溯法)
題目 給定乙個二維網格和乙個單詞,找出該單詞是否存在於網格中。單詞必須按照字母順序,通過相鄰的單元格內的字母構成,其中 相鄰 單元格是那些水平相鄰或垂直相鄰的單元格。同乙個單元格內的字母不允許被重複使用。示例 board a b c e s f c s a d e e 給定 word abcced ...