HDU 4370 0 or 1 最短路(神之轉換)

2021-08-21 20:01:19 字數 1486 閱讀 9443

題目鏈結

題目大意:

給乙個n*n的矩陣,讓你自己找乙個矩陣(矩陣的數非1即0),並求出∑c ij*x ij(1<=i,j<=n)的最小值

剛開始在最短路的知識部分接觸到這個題根本沒有頭緒,而且也沒注意到所求矩陣的特點(非0即1,很重要)

下面分析一下所要求矩陣的三個特點:

我們可以把行理解為圖中出度,列理解為入度

1.x 12+x 13+…x 1n=1 第一行挑乙個為1,轉化為在圖中點1的出度為1

2.x 1n+x 2n+…x n-1n=1 第n列挑乙個為1,轉化為在圖中點n的入度為1

3.∑xki =∑xij,轉化為編號在2-n-1的點的入度==出度

便於理解,題目給了個示例:

for example, if n=4,we can get the following equality:

x 12+x 13+x 14=1

x 14+x 24+x 34=1

x 12+x 22+x 32+x 42=x 21+x 22+x 23+x 24

x 13+x 23+x 33+x 43=x 31+x 32+x 33+x 34

即為中間編號在2-n-1之間的點的入度和出度相等

題目給的矩陣我們可以理解為每個點都和所有的點(包括本身)有且只有一條權值為c(i,j)的單向邊,

所以為了滿足以上三個條件,這個圖可以有以下兩種情況:

a. 從1到n有一條最短邊

b.從1出去回到1有最短邊,從n出去回到n有最短邊

比較一下a b兩種情況哪個短選哪個

區別於普通的最短路,因為要求從1到1至少經過其他乙個點的最短路,所以在spfa演算法初始化的時候,不能將點1入佇列,而是將除了1之外的所有其他點入隊,這樣點1再跑最短路的時候必須經過其他點

# include 

# include

# include

# include

using

namespace

std;

# define ll long long

# define maxn 310///標記點的最大數目

# define max 0x3f3f3f3f

ll data[maxn][maxn];///記錄所給矩陣的值,即各點之間邊的權值

ll dis[maxn];///記錄各點到始點的最短路

int n;

ll spfa(int start, int end)

else

}while(!q.empty())}}

}return dis[n];

}int main()

spfa(1,n);

ll a=dis[n];

ll b=dis[1];

spfa(n,n);

ll c=dis[n];

cout

0;}

HDU 2544 最短路 最短路

最近複習了最短路徑的演算法,就寫了4個版本的測試。正好是模板題,就果斷a之。dijkstar版本 include include include include include include includeusing namespace std define n 110 define max 99...

hdu 2544 最短路(最短路)

time limit1000 ms memory limit32768 kb 在每年的校賽裡,所有進入決賽的同學都會獲得一件很漂亮的t shirt。但是每當我們的工作人員把上百件的衣服從商店運回到賽場的時候,卻是非常累的!所以現在他們想要尋找最短的從商店到賽場的路線,你可以幫助他們嗎?input輸入...

HDU2544最短路(最短路徑)

description 在每年的校賽裡,所有進入決賽的同學都會獲得一件很漂亮的t shirt。但是每當我們的工作人員把上百件的衣服從商店運回到賽場的時候,卻是非常累的!所以現在他們想要尋找最短的從商店到賽場的路線,你可以幫助他們嗎?input 輸入包括多組資料。每組資料第一行是兩個整數n m n 1...