博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
poj 3281 Dining 最大流dinic 模板题
阅读量:4114 次
发布时间:2019-05-25

本文共 3352 字,大约阅读时间需要 11 分钟。

题意:有n头牛,每头牛喜欢吃几种对应的饮料和食物(不同牛喜欢的种类可能不同),求怎样分配
使得能同时吃到喜欢的饮料和食物的牛的个数最多;
#include 
#include
#include
#include
#include
#include
#include
#include
#include
#include
using namespace std; #define MM(a) memset(a,0,sizeof(a)) typedef long long ll; typedef unsigned long long ULL; const int mod = 1000000007; const double eps = 1e-10; const int inf = 0x3f3f3f3f; const int big=50000; int max(int a,int b) {return a>b?a:b;}; int min(int a,int b) {return a
G[500]; void add_edge(int f,int t) { G[f].push_back((Edge){t,1,G[t].size()}); G[t].push_back((Edge){f,0,G[f].size()-1}); } void bfs(int s) { queue
q; q.push(s); level[s]=1; //cout<
<<" "<
<
0) { Edge e=G[now][i]; //printf("%d: %d\n",now,e.to); if(level[e.to]<0) { level[e.to]=level[now]+1; //printf("%d %d: %d %d\n",now,level[now],e.to,level[e.to]); q.push(e.to); } } } } int dfs(int s,int t) { if(s==t) return 1; for(int i=0;i
level[s]&&e.cap>0&&dfs(e.to,t)) { e.cap-=1; G[e.to][e.rev].cap+=1; return 1; } } return 0; } int max_flow(int s,int t) { int ans=0; for(;;) { memset(level,-1,sizeof(level)); bfs(s); //printf("%d\n",level[t]); if(level[t]<0) return ans; while(dfs(s,t)) ans++; } } void init() { for(int i=0;i<=500;i++) G[i].clear(); } int main() { int n,f,d,fx,dx,temp; while(~scanf("%d %d %d",&n,&f,&d)) { init(); for(int i=1;i<=n;i++) { scanf("%d %d",&fx,&dx); for(int j=1;j<=fx;j++) { scanf("%d",&temp); add_edge(temp,f+i); } for(int j=1;j<=dx;j++) { scanf("%d",&temp); add_edge(i+n+f,2*n+f+temp); } } for(int i=1;i<=f;i++) add_edge(0,i); for(int i=1;i<=d;i++) add_edge(f+2*n+i,f+d+2*n+1); for(int i=1;i<=n;i++) add_edge(i+f,i+n+f); /* for(int i=0;i<=f+d+2*n+1;i++) for(int j=0;j
0) printf("%d: %d %d\n",i,G[i][j].to,G[i][j].cap); */ printf("%d\n",max_flow(0,f+d+2*n+1)); } return 0; }
分析:因为同时有饮料喝食物所以不能二分匹配,只能跑最大流;
wa代码:
#include 
#include
#include
#include
#include
#include
#include
#include
#include
#include
using namespace std; #define MM(a) memset(a,0,sizeof(a)) typedef long long ll; typedef unsigned long long ULL; const int mod = 1000000007; const double eps = 1e-10; const int inf = 0x3f3f3f3f; const int big=50000; int max(int a,int b) { return a>b?a:b;}; int min(int a,int b) { return a
G[500]; void add_edge(int f,int t) { G[f].push_back((Edge){ t,1,G[t].size()}); G[t].push_back((Edge){ f,0,G[f].size()-1}); } void bfs(int s) { queue
q; q.push(s); level[s]=1; while(q.size()) { int now=q.front();q.pop(); for(int i=0;i
0) { level[e.to]=level[s]+1; q.push(e.to); } } } } int dfs(int s,int t) { if(s==t) return 1; for(int i=0;i
level[s]&&dfs(e.to,t)) { G[s][i].cap-=1; G[e.to][G[s][i].rev].cap+=1; return 1; } } return 0; } void max_flow(int s,int t) { memset(level,-1,sizeof(level)); int ans=0; for(;;) { bfs(s); if(level[t]<0) break; while(dfs(s,t)) ans++; } printf("%d\n",ans); } int main() { int n,f,d,fx,dx,temp; while(~scanf("%d %d %d",&n,&f,&d)) { for(int i=1;i<=n;i++) { scanf("%d %d",&fx,&dx); for(int j=1;j<=fx;j++) { scanf("%d",temp); add_edge(temp,f+i); } for(int j=1;j<=dx;j++) { scanf("%d",&temp); add_edge(i+n+f,2*n+f+temp); } } for(int i=1;i<=f;i++) add_edge(0,i); for(int i=1;i<=d;i++) add_edge(f+2*n+i,f+d+2*n+1); max_flow(0,f+d+2*n+1); } return 0; }

转载地址:http://ztgsi.baihongyu.com/

你可能感兴趣的文章
浅谈JavaScript的语言特性
查看>>
LeetCode第39题思悟——组合总和(combination-sum)
查看>>
LeetCode第43题思悟——字符串相乘(multiply-strings)
查看>>
LeetCode第44题思悟——通配符匹配(wildcard-matching)
查看>>
LeetCode第45题思悟——跳跃游戏(jump-game-ii)
查看>>
LeetCode第46题思悟——全排列(permutations)
查看>>
LeetCode第47题思悟—— 全排列 II(permutations-ii)
查看>>
LeetCode第48题思悟——旋转图像(rotate-image)
查看>>
驱动力3.0,动力全开~
查看>>
记CSDN访问量10万+
查看>>
Linux下Oracle数据库账户被锁:the account is locked问题的解决
查看>>
记CSDN访问20万+
查看>>
Windows 环境下Webstorm 2020.3 版本在右下角找不到Git分支切换部件的一种解决方法
查看>>
Electron-Vue项目中遇到fs.rm is not a function问题的解决过程
查看>>
飞机换乘次数最少问题的两种解决方案
查看>>
有向无回路图的理解
查看>>
设计模式中英文汇总分类
查看>>
WPF实现蜘蛛纸牌游戏
查看>>
单例模式
查看>>
工厂方法模式
查看>>