BZOJ2055 80人環遊世世界

2022-05-30 19:18:15 字數 1414 閱讀 3532

​ 想必大家都看過成龍大哥的《80天環遊世界》,裡面的緊張刺激的打鬥場面一定給你留下了深刻的印象。現在就有這麼

​ 乙個80人的團夥,也想來一次環遊世界。

​ 他們打算兵分多路,遊遍每乙個國家。

​ 因為他們主要分布在東方,所以他們只朝西方進軍。設從東方到西方的每乙個國家的編號依次為1...n。假若第i個人的遊歷路線為p1、p2......pk(0≤k≤n),則p1​ 眾所周知,中國相當美麗,這樣在環遊世界時就有很多人經過中國。我們用乙個正整數vi來描述乙個國家的吸引程度,vi值越大表示該國家越有吸引力,同時也表示有且僅

有vi個人會經過那乙個國家。

​ 為了節省時間,他們打算通過坐飛機來完成環遊世界的任務。同時為了省錢,他們希望總的機票費最小。

​ 明天就要出發了,可是有些人臨陣脫逃,最終只剩下了m個人去環遊世界。他們想知道最少的總費用,你能告訴他們嗎?

第一行兩個正整數n,m。

第二行有n個不大於m正整數,分別表示v1,v2......vn。

接下來有n-1行。第i行有n-i個整數,該行的第j個數表示從第i個國家到第i+j個國家的機票費(如果該值等於-1則表示這兩個國家間沒有通航)。

在第一行輸出最少的總費用。

6 3

2 1 3 1 2 1

2 6 8 5 0

8 2 4 1

6 1 0

4 -1

4

27
拆點之後跑上下界最小費用可行流。

挺模板的。

#includeusing namespace std;

void read(int &x)

void print(int x)

void write(int x)

#define lf double

#define ll long long

const int maxn = 2e5+10;

const int inf = 1e9;

const lf eps = 1e-8;

int n,m,head[maxn],tot=1,dis[maxn],vis[maxn],cost,r[maxn];

struct edgee[maxn<<1];

void add(int u,int v,int w,int c) ,head[u]=tot;}

void ins(int u,int v,int w,int c)

int spfa(int s,int t)

}return dis[t]0&&dis[v]==dis[x]+e[i].c)

return used;

}int cost_flow(int s,int t)

int main()

BZOJ2055 80人環遊世界

題解 總算a掉了,各種蛋疼。int main for1 i,n for2 j,i 1,n for1 i,n insert i n,t,0,inf,0 insert t,s,0,inf,0 mcf printf d n mincost return0 s是附加源,sss是真正的源,t是真正的匯。這樣構...

bzoj 2055 80人環遊世界

有源匯上下界最小費用可行流。將每個國家拆點。源點向乙個新建節點連一條上界為總人數下界為0費用為0的邊。新建節點向每個國家的入點連一條上界為正無窮下界為0費用為0的邊。每個國家的入點向出點連一條上下界均為該國家訪問人數費用為0的邊。每個國家的出點向匯點連一條上界為正無窮下界為0費用為0的邊。對於國家i...

BZOJ2055 80人環遊世界

上下界最小費用流 限制點訪問量 拆點 i,i 建圖 1.s s m,m 0 2.s i 0,inf 0 i t 0,inf 0 3.i j 0,inf x 4.i i vi,vi 0 然後就是上下界流的常見套路啦 根據 調整 原則 先是每個點點權為di ini outi 然後 0的連源點 0的連匯點...