日韩性视频-久久久蜜桃-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 图的最长路的全部內容,希望文章能夠幫你解決所遇到的問題。

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

主站蜘蛛池模板: 国产精品一线二线 | 日韩欧美aⅴ综合网站发布 国产成人一区二区三区小说 | 中文在线观看av | 日韩欧美三级视频 | caoporn免费在线| 男女午夜激情 | 久久精品综合视频 | 日韩精品字幕 | 一区二区免费在线观看视频 | 国产喷水吹潮视频www | 色就操| 欧美激情校园春色 | 国产真实伦对白全集 | 亚州欧美 | 国产婷婷一区二区 | 97xxxxx| 双性人bbww欧美双性 | 女人下面流白浆的视频 | 91成人亚洲 | 国产亚洲精品久久久久久青梅 | 女人扒开屁股让我添 | 在线观看免费福利 | 国产一级做a爰片在线看免费 | 黄a网站 | 欧美性爱精品一区 | 丁香色综合 | 亚洲aⅴ | 日韩在线免费视频观看 | 欧美激情免费在线观看 | 大尺度做爰呻吟舌吻网站 | 爱福利视频广场 | 情侣自拍av | 亚洲精品乱码久久久久久日本蜜臀 | 中文字幕乱码中文乱码b站 国产一区二区三区在线观看视频 | 色婷婷av一区二区三区在线观看 | 东京热毛片 | 欧美第一网站 | 日本五十路 | 色婷婷av一区二区 | 极品videosvideo喷水 | 国产超碰精品 | 美女在线不卡 | 精品一区二区三区电影 | 操操操爽爽爽 | aaaaaaa毛片 | 国产乱视频 | 国产日b视频| 久久久久久久成人 | 喷水视频在线观看 | 中文亚洲av片不卡在线观看 | 丁香啪啪综合成人亚洲 | 大又大又粗又硬又爽少妇毛片 | 天天草天天操 | 国产免费视频一区二区三区 | 午夜精品久久久久久毛片 | 人妻内射一区二区在线视频 | 国产av一区二区三区 | 日韩大片免费观看 | 日本色区 | 久久国色| 男男做爰猛烈叫床爽爽小说 | 真实人妻互换毛片视频 | 中文字幕精品一区二区精 | 国产二三区 | 爽爽视频在线观看 | 色呦呦网站在线观看 | 蜜桃av噜噜| www.午夜视频 | 青青青青青操 | 国产淫片 | 成人永久免费视频 | 围产精品久久久久久久 | www..com色| 黑森林av导航 | 成人性生交免费看 | 97人妻天天摸天天爽天天 | 成人在线观看国产 | 欧美片| 中文字幕一区二区三区乱码在线 | 三级免费网址 | 欧美网站在线 | 麻豆网站入口 | 亚洲偷怕 | 毛片高清免费 | 五月激情片 | 成年人视频在线播放 | 少妇高潮久久久久久潘金莲 | 在线免费看毛片 | chinese hd xxxx tube麻豆tv | 成人黄色免费观看 | 加勒比一区二区三区 | 色片免费看| 狠狠操在线| 天堂视频中文在线 | 中国挤奶哺乳午夜片 | 免费网站av | 被黑人猛躁10次高潮视频 | 欧美一区亚洲二区 | av片在线观看 |