日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當(dāng)前位置: 首頁 > 编程资源 > 编程问答 >内容正文

编程问答

hdu4848 DFS 暴搜+ 强剪枝

發(fā)布時間:2025/6/17 编程问答 44 豆豆
生活随笔 收集整理的這篇文章主要介紹了 hdu4848 DFS 暴搜+ 强剪枝 小編覺得挺不錯的,現(xiàn)在分享給大家,幫大家做個參考.
題意:
? ? ? 給你一個圖,然后問你從1出發(fā)遍歷所有的點的距離和是多少,這里的距離和是每一個點到1的距離的總和,不是選擇一條遍歷所有點的路徑的總長度,時間限制是 8000ms。

思路:

? ? ? 一開始理解錯了,以為是選擇一條路徑能遍歷所有點的路徑的總長度,如果是這樣可以有兩種方法一個就是暴搜時間復(fù)雜度n!(不可以),另一個是dp,開dp[i][j] i是狀態(tài),j是點(也不可以,狀態(tài)太大了),所以就蛋疼了,后來發(fā)現(xiàn)自己讀錯題了,what's all,哎! 這個題目可以直接暴搜,有兩個剪紙,一個就是根據(jù)時間剪紙,每一步必須保證后面的所有的時間都來得及,另一個就是如果當(dāng)前值比答案還大,那么就直接return.

#include<stdio.h> #include<string.h> int time[33] ,mark[33]; int dis[33][33]; int n ,ans;int minn(int x ,int y) {return x < y ? x : y; }void Floyd(int n) {for(int k = 1 ;k <= n ;k ++)for(int i = 1 ;i <= n ;i ++)for(int j = 1 ;j <= n ;j ++)dis[i][j] = minn(dis[i][j] ,dis[i][k] + dis[k][j]); }void DFS(int frm ,int s ,int len ,int ge ,int sum) {if(s == n){ans = minn(ans ,sum);return ;}if(sum > ans) return;for(int i = 2 ;i <= n ;i ++)if(!mark[i] && len + dis[frm][i] > time[i])return;for(int i = 2 ;i <= n ;i ++){if(!mark[i]){mark[i] = 1;DFS(i ,s + 1 ,len + dis[frm][i] ,ge - 1 ,sum + dis[frm][i] * ge);mark[i] = 0;}} }int main () {int i ,j;while(~scanf("%d" ,&n)){for(i = 1 ;i <= n ;i ++)for(j = 1 ;j <= n ;j ++)scanf("%d" ,&dis[i][j]);for(i = 2 ;i <= n ;i ++)scanf("%d" ,&time[i]);Floyd(n);ans = 1000000000;memset(mark ,0 ,sizeof(mark));DFS(1 ,1 ,0 ,n - 1 ,0);ans == 1000000000 ? puts("-1") : printf("%d\n" ,ans);}return 0; }

總結(jié)

以上是生活随笔為你收集整理的hdu4848 DFS 暴搜+ 强剪枝的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網(wǎng)站內(nèi)容還不錯,歡迎將生活随笔推薦給好友。