uoj51 最小生成樹 揹包 bitset

2021-07-24 13:53:26 字數 1524 閱讀 4617

description

兔紙王國中有 nn 個城市,第 ii 個城市和第 jj 個城市的距離是 di,jdi,j (保證di,j=dj,i且di,i=0di,j=dj,i且di,i=0) 。

兔紙們使用兩種蘿蔔來修路,分別是富含胡蘿蔔素的蘿蔔和富含維生素cc的蘿蔔,單價分別是p1,p2p1,p2。由於經濟蕭條,所以兩種蘿蔔的上限分別是q1,q2q1,q2。

現在兔紙們希望修建若干條道路,使得任意兩個城市聯通。既然經濟蕭條的話,它們希望知道最小的總費用。顯而易見的,兔紙們是不會同意一條道路上存在兩種蘿蔔的。

input specification

第 11 行, 11 個整數 nn。

第 22 行到第 n+1n+1 行, nn 個整數di,jdi,j。

第 n+2n+2 行, 44 個整數 p1,p2,q1,q2p1,p2,q1,q2 。

output specification

第 11 行, 11 個整數, 表示最小的總費用。無解則輸出 -1 。

input and output sample

[input 1]

20 2

2 02 3 1 3

[output 1]

6[input 2]

30 1 3

1 0 2

3 2 0

1 2 5 0

[output 2]

3extra input sample

extra output sample

data restriction

對於 30% 的資料, 1≤n≤51≤n≤5。

對於 60% 的資料, 1≤n≤201≤n≤20。

對於 100% 的資料, 1≤n≤1,000,∀i≠j:1≤di,j≤1,000,0≤p1,p2,q1,q2≤1,000,0001≤n≤1,000,∀i≠j:1≤di,j≤1,000,0≤p1,p2,q1,q2≤1,000,000。

【思路】先找出最短路,然後用揹包,用bitset可以省時間和空間,其中f[ i ]表示是否有和為i的方案

【**】

#include #include #include #include #include #include #define ll long long

#define maxn 1003

#define inf 10000000000013

using namespace std;

bitset<1000006>f;

struct data

} q1=get(),q2=get(),p1=get(),p2=get();

sort(e+1,e+1+cnt);

}int getfa(int x)

void solveit(){

int t=0;f[0]=1;

for(int i=1;i<=n;++i)fa[i]=i;

for(int i=1;i<=cnt;++i){

int x=getfa(e[i].u),y=getfa(e[i].v);

if(x!=y){

f|=f<

最小生成樹 次小生成樹

一 最小生成樹 說到生成樹首先要解釋一下樹,樹是乙個聯通的無向無環圖,多棵樹的集合則被稱為森林。因此,樹具有許多性質 1.兩點之間的路徑是唯一的。2.邊數等於點數減一。3.連線任意兩點都會生成乙個環。對於乙個無向聯通圖g的子圖,如果它包含g的所有點,則它被稱為g的生成樹,而各邊權和最小的生成樹則被稱...

51nod1640 最小生成樹

題意 在一副圖中,搞n 1條邊,使得每個點都相連,有多種可能的情況,所以求一種使得其中n 1條邊的最大是所有可能的最小,然後並保證連線的n 1條邊的權值總和最大 思路 一開始沒有看清題意,隨便寫了一發 最大生成樹 連案例都跑不出,原來還有個條件是有n 1條邊中的最大值是所有可能的最小。然後窩就納悶了...

最小生成樹

package 圖 最小生成樹是用最少的邊吧把所有的節點連線起來。於是和圖的深度優先搜素差不多。class stack public void push int key public int pop 檢視棧頂的元素 public int peek public boolean isempty cla...