0 or 1 HDU 4370 思維最短路

2021-10-05 16:13:25 字數 1790 閱讀 1027

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很大,所以開了乙個向量來計算,再用乙個陣列來儲存.提醒自己要注意的就是.向量的那個地方最開始靈活處理不行,後來才發現是因為對向量裡面的元素進行插入的原因,就對其進行插入,刪除,壓入,彈出等等一系列操作.只要改變了裡面的元素順序或者是改變了...