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

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 编程资源 > 编程问答 >内容正文

编程问答

图论 —— DAG 图的最长路

發布時間:2025/3/17 编程问答 24 豆豆
生活随笔 收集整理的這篇文章主要介紹了 图论 —— DAG 图的最长路 小編覺得挺不錯的,現在分享給大家,幫大家做個參考.

【概述】

DAG 圖的最長路問題是一個比較少見的問題,具體問題是:給出一個 DAG 圖,尋找圖中的最長路

在 AOE 網中,在找出關鍵路徑后,對其進行 DFS 即可得到圖的最長路,由于這種方法的實現過于繁瑣,這里介紹幾種較為簡單的實現。

【最短路算法】

對于最短路算法,Floyd,Dijkstra、Bellman-Ford、SPFA 等,將其松弛操作進行修改,即可將最短路算法變為最長路算法。

以 Floyd 為例:

int G[N][N]; void Floyd(){for(int k=1;k<=n;k++)for(int i=1;i<=n;i++)for(int j=1;j<=n;j++)if(i!=k&&j!=i&&j!=k)if(g[i][j]<g[i][k]+g[k][j])g[i][j]=g[i][k]+g[k][j]; } int main(){int n,m;scanf("%d%d",&n,&m);for(int i=1;i<=n;i++)for(int j=1;j<=n;j++)scanf("%d",&g[i][j]);Floyd();int res=-INF;for(int i=1;i<=n;i++)for(int j=1;j<=n;j++)res=max(g[i][j],res);printf("%d\n",res);return 0; }

【拓撲排序】

在拓撲排序的過程中,不斷記錄路徑,最后對路徑進行排序,輸出最大的那個即為 DAG 的最長路

struct Node{int to,dis;Node(){}Node(int to,int dis):to(to),dis(dis){} }; vector<Node> G[N]; int in[N]; int dis[N]; int n,m; void topSort() {stack<int > S;for(int i=1; i<=n; i++)if(!in[i])S.push(i);while(!S.empty()) {int x=S.top();S.pop();for(int j=0; j<G[x].size(); j++) {int y=G[x][j].to;dis[y]=max(dis[y],dis[x]+G[x][j].dis);in[y]--;if(!in[y])S.push(y);}} }int main() {int T;scanf("%d",&T);while(T--){scanf("%d%d",&n,&m);memset(in,0,sizeof(in));memset(dis,0,sizeof(dis));for(int i=0; i<=n; i++)G[i].clear();for(int i=1; i<=m; i++) {int x,y,dis;scanf("%d%d%d",&x,&y,&dis);Node temp;temp.to=y;temp.dis=dis;in[y]++;G[x].push_back(temp);}topSort();int res=-INF;for(int i=1;i<=n;i++)res=max(res,dis[i]);printf("%d\n",res);}return 0; }

【動態規劃】

1.不固定終點起點

當給定一個 DAG 圖時,要求整個圖中所有路徑中權值和最大的那條,即不固定終點和起點問題。

設 dp[i] 為從 i 點出發能獲得的最長路徑長度,G[i][j] 為從 i 點到 j 點的距離,這樣所有的 dp[i] 的最大值就是整個 DAG 的最長路徑長度,如果從 i 點出發,能直接到達頂點 j1、j2、...、jk,而 dp[j1]、dp[j2]、...、dp[k] 均已知,那么有:dp[i]=max{ dp[j]+G[i][j] }

根據上面的思路,由于最后的頂點沒有出邊,因此需要按照逆拓撲排序來求解 dp 數組,但可以利用遞歸來進行求解:由于從出度為 0 的頂點出發的最長路徑長度為 0,因此邊界就是這些點,在具體實現中不妨對整個 dp 數組初始化為 0,這樣 DP 函數當前訪問頂點i的出度為0時就會直接返回 dp[i]=0,而出度不為 0 的時候就會遞歸求解,遞歸過程中遇到已經計算過的頂點則直接返回對于的 dp 值,于是從邏輯上實現了逆拓撲排序的效果。

其基于鄰接矩陣實現的代碼如下:

int dp[N];//使用前整個數組設為0 int G[N][N]; int DP(int i) {if(dp[i]>0)return dp[i];for(int j=0; j<n; j++)//遍歷i的所有可達出邊if(G[i][j]!=INF)dp[i]=max(dp[i],DP(j)+G[i][j]);return dp[i]; }

當需要輸出這條最長路時,可以利用一個 next 數組來記錄 i 頂點的后繼結點,再求完最長路后,順序打印路徑即可

int DP(int i) {if(dp[i]>0)return dp[i];for(int j=0; j<n; j++) { //遍歷i的所有可達出邊if(G[i][j]!=INF) {int temp=DP(j)+G[i][j];//單獨計算dpif(dp[i]<temp) { //可以獲得更長的路徑dp[i]=temp;next[i]=j; //保存i的后繼頂點j}}}return dp[i]; } void printPath(int i) {//調用前需先獲得最大的dp[i],然后將i作為路徑的起點傳入printf("%d",i);while(next[i]!=-1) { //next數組初始化為-1i=next[i];printf("->%d",i);}printf("\n"); }

2.固定終點起點

給定一個 DAG 圖,給出一個起點和終點,要求從起點到終點的路徑中權值和最大的那條,即固定終點和起點問題。

設規定的終點為 T,那么設 dp[i] 為從 i 號點出發到達終點 T 所能獲得的最大長度,G[i][j] 為從 i 點到 j 點的距離,如果從 i 點出發,能直接到達頂點 j1、j2、...、jk,而 dp[j1]、dp[j2]、...、dp[k] 均已知,那么有:dp[i]=max{ dp[j]+G[i][j] }

可以發現,這個 dp 式子與上面不固定終點起點的問題相同,但問題的區別在于邊界

第一個問題中,沒有固定的終點,因此邊界為所有出度為 0 的頂點,其?dp 值為 0

第二個問題中,固定了終點,因此邊界應當為 dp[T]=0,需要注意的是,由于從某頂點出發可能會無法到達終點 T,因此此時 dp 數組不能再全部初始化為 0,比較合適的做法是將 dp 初始化為一個極大的負數(-INF),來表達無法到達終點,然后設置一個 vis 數組來表示頂點是否已被訪問

int vis[N]; int G[N][N]; int dp[N];//使用前初始化為-INF,且終點dp[T]=0 int DP(int i) {if(vis[i]) return dp[i];vis[i]=true;for(int j=0; j<n; j++) { //遍歷i的所有可達出邊if(G[i][j]!=INF) {dp[i]=max(dp[i],DP(j)+G[i][j]);}}return dp[i]; }

【例題】

  • Find the safest road(HDU-1596)(Floyd 變形求最長路):點擊這里
  • 矩形嵌套(NYOJ-16)(dp 求最長路):點擊這里
  • Skiing(2017 ACM-ICPC 亞洲區(烏魯木齊賽區)網絡賽 H)(拓撲排序求最長路):點擊這里
新人創作打卡挑戰賽發博客就能抽獎!定制產品紅包拿不停!

總結

以上是生活随笔為你收集整理的图论 —— DAG 图的最长路的全部內容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。

主站蜘蛛池模板: 神马午夜91 | 性生活视频播放 | 欧美成人三级在线视频 | a级片在线播放 | 免费视频亚洲 | 免费a在线 | 精品国产乱码久久久久久图片 | 双性人妖互交localhost | 欧美日韩高清一区二区 | 糖心av | 五月婷六月 | 中文在线字幕免费观 | 成人看的毛片 | 久久久久99人妻一区二区三区 | 污网站免费在线观看 | 久久久人人人 | 久久成人免费网站 | 欧美破处大片 | 久久人妻少妇嫩草av无码专区 | 曰批女人视频在线观看 | 国产精品国产三级国产专播精品人 | 超碰公开免费 | 色噜噜狠狠狠综合曰曰曰88av | 国产三级av在线播放 | 国产一区二区视频免费观看 | 青青草综合在线 | 99re这里只有精品在线观看 | 性生交大片免费看女人按摩 | 综合久久一区 | 夜色成人网 | 色播在线视频 | 伊人色综合久久久 | a天堂在线视频 | 免费看欧美黑人毛片 | 国产专区视频 | 中文字幕国产专区 | 日本少妇中文字幕 | 91呦呦| 亚洲一区二区日本 | 青娱乐欧美 | 日日拍夜夜拍 | 91好色先生tv | 久久久久久片 | 日本少妇高潮抽搐 | 午夜两性| 国产精品久草 | 青草草在线观看 | 欧美aaaa视频 | 日日躁夜夜躁狠狠久久av | 久久久高清视频 | 精品国产乱码久久久久久蜜柚 | aa视频免费观看 | 欧美黄色小视频 | 久一久久| v片在线看 | 精品人妻一区二区三区四区五区 | 嫩草在线看 | 影音先锋在线观看视频 | 在线观看av国产一区二区 | 四季av一区二区凹凸精品 | 久久深夜视频 | 色免费看 | 国产免费麻豆 | 图片区小说区视频区 | 高清一区二区三区 | 麻豆蜜桃在线观看 | 欧美自拍偷拍一区二区 | 99自拍 | 老色批永久免费网站www | 国产秋霞 | 黄色网入口| 日韩一区二区免费在线观看 | 91久色蝌蚪 | 香港三级在线视频 | 成人黄色动漫在线观看 | 一级特黄a| 成人颜色网站 | 嫩草影院一区二区 | 国产毛片网 | 激情片 | 久久新网址 | 国产成人精品一区二区在线观看 | 裸体美女免费视频网站 | 明日叶三叶 | 前任攻略在线观看免费完整版 | 99re8在线精品视频免费播放 | 亚洲美免无码中文字幕在线 | 欧美精品一级 | 蜜臀久久精品久久久用户群体 | 不卡av免费在线观看 | 日本天堂网在线 | 欧美高清在线视频 | 神马午夜电影一区二区三区在线观看 | 女教师三上悠亚ssni-152 | 在线观看视频免费 | 亚洲在线看| 免费黄色观看 | jizz欧洲 | 久久黑丝|