題目鏈結
題目大意:
給乙個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...