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

歡迎訪問 生活随笔!

生活随笔

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

编程问答

hdu4370 比较抽象的最短路

發布時間:2025/6/17 编程问答 16 豆豆
生活随笔 收集整理的這篇文章主要介紹了 hdu4370 比较抽象的最短路 小編覺得挺不錯的,現在分享給大家,幫大家做個參考.
題意:
? ? ? 給你一個n*n的矩陣,然后讓咱們構造另一個n*n的矩陣,構造的矩陣有如下要求,
1.X12+X13+...X1n=1.
2.X1n+X2n+...Xn-1n=1.
3.for each i (1<i<n), satisfies ∑Xki (1<=k<=n)=∑Xij (1<=j<=n).

思路:

? ? ? 感覺這個思路很奇葩啊,看了網上好多解釋,但是很失望啊,幾乎所有人說的都一樣啊,一樣到幾乎不差一個字,我就 呵呵了,說實話這個題目我不是很理解,可以說現在并不是很明白,但是我可以說下我現在對他們的做法的一些理解,可能不全面,也可能有錯誤,希望路過的大牛指點,首先據說這是個0/1規劃問題,我只知道0/1分數規劃,不知道什么是0/1規劃,而且具我的了解這個題目跟0/1分數規劃沒啥關系,我們現在就往圖論上靠一下,首先虛擬出n個點來,記住這n個點不是行,也不是列,把題目給的矩陣就單獨當成是一些數據,一些點之間的距離,不要去往矩陣上想,這樣便于理解,然后分析它給的三個條件:


1.X12+X13+...X1n=1. 這個條件可以理解成是點1的出度為1,因為1會選擇也只能選擇一個點連出去,這樣的話1的出度為0.


2.X1n+X2n+...Xn-1n=1. 同上,n的入度為0.

3.for each i (1<i<n), satisfies ∑Xki (1<=k<=n)=∑Xij (1<=j<=n).這個說的是除了1,n外,所有的點的入度和出度都相等。

這樣,突然就想到了圖的特點,這樣我們想象一下,超級原點1,超級匯點n,中間所有的都是入度等于出度,讓我們找一個最小的花費滿足上面的3點要求,而且最關鍵的是所有點的權值都是 >= 0的,這樣我們就可以用最短路去跑了,直接跑1->n之間的最短路,可能有人想,跑最短路不是直接就默認中間的點的部分所有的入度和出度都是1了?沒錯,所有的都是1,因為想象一下,能用1就滿足題意了,還有必要再多跑嗎?這個地方不要想矩陣的問題,不然很容易蒙的,這樣我們跑出最短路c,這個是一種情況,還有另一種情況就是可以直接從1跑一個最小環得到花費c1,然后從n跑一個環得到最小花費c2,兩個環也滿足上面的三個限制,這樣我們只要輸出min(c ,c1 + c2)就行了,對了還有一個差點忘記說了,至于找最小花費環,方法很多,可以直接搜索,說一個對于這個題目比較簡單的方法(在網上看的!嘿嘿),我們可以在跑最短路的時候先把起始點入隊,把起始點連接的所有點入隊,這樣跑完

之后,到起始點的最短距離就是最小環了(具體看代碼),以上就是我對網上題解的理解,目前只有這些,可能不對,很希望能和看到的人一起交流研究這個題目。


#include<stdio.h> #include<string.h> #include<queue>#define N_node 330 #define INF 1000000000 using namespace std;int cost[N_node][N_node]; int s_x[N_node] ,mark[N_node];void spfa(int s ,int n) {for(int i = 0 ;i <= n ;i ++)s_x[i] = INF ,mark[i] = 0;queue<int>q;for(int i = 1 ;i <= n ;i ++){if(s == i) continue;s_x[i] = cost[s][i];mark[i] = 1;q.push(i);}while(!q.empty()){int xin ,tou;tou = q.front();q.pop();mark[tou] = 0;for(int i = 1 ;i <= n ;i ++){xin = i;if(s_x[xin] > s_x[tou] + cost[tou][xin]){s_x[xin] = s_x[tou] + cost[tou][xin];if(!mark[xin]){mark[xin] = 1;q.push(xin);}}}} }int main () {int i ,j ,n;while(~scanf("%d" ,&n)){for(i = 1 ;i <= n ;i ++)for(j = 1 ;j <= n ;j ++)scanf("%d" ,&cost[i][j]);spfa(1 ,n);int Ans = s_x[n];int c1 = s_x[1];spfa(n ,n);int c2 = s_x[n];if(Ans > c1 + c2) Ans = c1 + c2;printf("%d\n" ,Ans);}return 0; }

《新程序員》:云原生和全面數字化實踐50位技術專家共同創作,文字、視頻、音頻交互閱讀

總結

以上是生活随笔為你收集整理的hdu4370 比较抽象的最短路的全部內容,希望文章能夠幫你解決所遇到的問題。

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