given a nn matrix c ij (1<=i,j<=n),we want to find a nn matrix x ij (1<=i,j<=n),which is 0 or 1.besides,x ij meets the following conditions:
1.x 12+x 13+…x 1n=1
2.x 1n+x 2n+…x n-1n=1
3.for each i (1the input consists of multiple test cases (less than 35 case).
for each test case ,the first line contains one integer n (1for each case, output the minimum of ∑c ij*x ij you can get.
4思路:1 2 4 10
2 0 1 1
2 2 0 5
6 3 1 2
聯想到圖的矩陣儲存
x 12+x 13+x 14=1 要求點1的出度為1,不存在點1指向1的情況
x 14+x 24+x 34=1 要求點n的入度為1,不存在點n指向n的情況
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
x矩陣的0代表走這條邊,1代表不走這條邊,轉化為求頂點1到n的最短路徑
點1出度為一(條件一),那麼一定要到另乙個點,如果到n則求1到n的最短路,如果到其他點,由於其他點的出入度要求相同(條件三),這時需要該點一定有一條出去的邊,如果到n則有1到n的最短路,如果不到n點則必然有1–>1的閉環,當有1–>1的自環時,點n的入度為一,則必有乙個點指向n,並且只能是點1,n以外的其他點,由於其他點的出入度要求相同(條件三),此時必有n–>n的閉環。
所以一定有1到n的路或 有n的自環和1的自環。
所以需要計算1到n的最短路,1自環和n自環的總值,兩者最小就為答案。
#include
#include
#include
using
namespace std;
const
int inf =
0x3f3f3f3f
;int n, cir, ans;
int g[
305]
[305
], d[
305]
;bool vis[
305]
;void
dijikstra
(int s)
vis[t]
=true
;for
(int j =
1; j <= n; j++)}
}int
main()
} cir = inf;
dijikstra(1
);ans = d[n]
;int t = cir;
//1的子環
cir = inf;
dijikstra
(n);
t += cir;
//加上n的子環
printf
("%d\n"
,min
(ans, t));
}return0;
}
HDU 1166 敵兵布陣 樹狀陣列從0到1
如果給你乙個陣列,讓你求某個區間的和,你很自然會想到遍歷一遍陣列,複雜度是o n 但是如果有多次詢問呢,你也許會想到用字首陣列,通過o n 的預處理,達到o 1 的查詢,但是如果要更新某個元素的值呢,如果用字首和的思想,每更新乙個元素就會更新字首陣列,每次複雜度是o n 如果有n次更改,複雜度為o ...
讀書1 從0到1
總結你身邊是不是總有這樣的人,他特立獨行,有的時候厭煩規則,顯得與眾不同。如果有,請盯住他們,本書就以這類人為論述,作者對他們的迷戀堪稱瘋狂。最近看的一場電影 綠皮書 其中的唐雪莉和托尼就是這樣的人,托尼改掉歧視黑人的行為,甚至為黑人唐打工,而唐也與其他黑人格格不入,他特立獨行,不了解黑人 他是鋼琴...
hdu1040 0 1變換輸出連續0
題目連線 自己推導的公式是an a n 3 2 n 2 因為n很大,所以開了乙個向量來計算,再用乙個陣列來儲存.提醒自己要注意的就是.向量的那個地方最開始靈活處理不行,後來才發現是因為對向量裡面的元素進行插入的原因,就對其進行插入,刪除,壓入,彈出等等一系列操作.只要改變了裡面的元素順序或者是改變了...