給出一種最小割的方法。
設\(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...