51nod 1321 收集點心(最小割)

2022-05-19 20:35:25 字數 1267 閱讀 7463

給出一種最小割的方法。

設\(num1[i]\),\(num2[i]\)為第i種形狀的點心的兩種口味的數量

設\(type[i]\),\(type[i]\)為第i種形狀的點心的兩種口味

假設\(num1[i]

考慮幾種最優的購買方案:

1.買\(num1[i]+1\)個點心。這樣一定可以得到\(type2[i]\)。

2.買\(num2[i]+1\)個點心。這樣一定可以得到\(type1[i]\)和\(type2[i]\)。

3.不買。這樣連毛都得不到。

然後根據這幾個購買方案建圖。

把每乙個點i,拆成\(i\),\(i+n\)

設\(s\)為源點,\(t\)為匯點。

對於每乙個\(i\),\(s\)到\(i\)連容量為\(num2[i]+1\)的邊,\(i+n\)到\(t\)連容量為\(num2[i]+1\)的邊。

對於每乙個口味,設它對應的形狀為\(i\)和\(j\),從\(i\)到\(j+n\)和\(j\)到\(i+n\)連容量為通過買形狀為i或j的點心總而買到這個口味點心的最小代價的較小值。

然後跑最小割。

因為圖是對稱的,答案就是最小割/2

#include#include#include#include#include#include#includeusing namespace std;

const int n=1010;

const int inf=1e9;

int n,cnt,head[n*2],ans,s,t,dis[n*2];

int read()

while(ch>='0'&&ch<='9')

return sum*f;

}struct node

};vectorvec[n];

struct edgee[n*8];

void add_edge(int u,int v,int flow)

bool bfs()

} }if(dis[t]==-1)return false;

return true;

}int dfs(int u,int f)

} }if(used==0)dis[u]=-1;

return used;

}void dinic()

int main()

for(int i=1;i<=n;i++)

dinic();

printf("%d",ans/2);

return 0;

}

51nod 1321 收集點心 動態規劃

城市裡有乙個點心店,裡面有許多不同的點心。已知這些點心有以下特點 1 這些點心被設計為n種不同的形狀,不妨將不同的形狀標號為0,1,2,3.n 1 2 這些點心被製作為n種不同的口味,不妨也將不同的口味標號為0,1,2,3.n 1 3 你在購買點心時,只能觀察到它們的形狀,卻不知道它們的口味 在購買...

51nod 最小集合

最小集合 system message 命題人 基準時間限制 1 秒 空間限制 131072 kb 分值 80 a君有乙個集合。這個集合有個神奇的性質。若x,y屬於該集合,那麼x與y的最大公因數也屬於該集合。但是他忘了這個集合中原先有哪些數字。不過幸運的是,他記起了其中n個數字。當然,或許會因為過度...

51nod 1096 距離之和最小

1096 距離之和最小 基準時間限制 1 秒 空間限制 131072 kb 分值 20 難度 3級演算法題 x軸上有n個點,求x軸上一點使它到這n個點的距離之和最小,輸出這個最小的距離之和。input 第1行 點的數量n。2 n 10000 第2 n 1行 點的位置。10 9 p i 10 9 ou...