想必大家都看過成龍大哥的《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的連匯點...