题目链接

我做的伤心了,不知是模版效率低,还是错了,交上就是TLE,找了份别人的代码,改了好几下终于过了。。

  1 #include <cstdio>
  2 #include <cstring>
  3 #include <queue>
  4 #include <map>
  5 #include <iostream>
  6 using namespace std;
  7 #define INF 0x3fffffff
  8 char food[201][201],drink[201][201];
  9 struct node
 10 {
 11     int u,v,next,re,w;
 12 }edge[200001];
 13 int first[2001],dis[2001];
 14 int t,str,end;
 15 void CL()
 16 {
 17     t = 1;
 18     memset(first,-1,sizeof(first));
 19 }
 20 void add(int u,int v,int w)
 21 {
 22     edge[t].u = u;
 23     edge[t].v = v;
 24     edge[t].w = w;
 25     edge[t].re = t+1;
 26     edge[t].next = first[u];
 27     first[u] = t++;
 28     edge[t].u = v;
 29     edge[t].v = u;
 30     edge[t].w = 0;
 31     edge[t].re = t-1;
 32     edge[t].next = first[v];
 33     first[v] = t ++;
 34 }
 35 int bfs()
 36 {
 37     int u,v,i;
 38     memset(dis,0xff,sizeof(dis));
 39     queue<int> que;
 40     que.push(str);
 41     dis[str] = 0;
 42     while(!que.empty())
 43     {
 44         u = que.front();
 45         que.pop();
 46         for(i = first[u];i != -1;i = edge[i].next)
 47         {
 48             v = edge[i].v;
 49             if(edge[i].w > 0&&dis[v] < 0)
 50             {
 51                 dis[v] = dis[u] + 1;
 52                 que.push(v);
 53             }
 54         }
 55     }
 56     if(dis[end] > 0) return 1;
 57     else return 0;
 58 }
 59 int dfs(int u,int step)
 60 {
 61     int i,temp,v,tf = 0;
 62     if(u == end) return step;
 63     for(i = first[u];i != -1;i = edge[i].next)
 64     {
 65         v = edge[i].v;
 66         if(edge[i].w > 0&&dis[v] == dis[u] + 1&&(temp = dfs(v,min(step,edge[i].w))))
 67         {
 68             edge[i].w -= temp;
 69             edge[edge[i].re].w += temp;
 70             return temp;
 71         }
 72     }
 73     if(!tf) dis[u] = -1;//注意这里
 74     return tf;
 75 }
 76 int main()
 77 {
 78     int i,j,res,ans,n,f,d,temp;
 79     while(scanf("%d%d%d",&n,&f,&d)!=EOF)
 80     {
 81         ans = 0;
 82         str = 0;
 83         end = 2000;
 84         CL();
 85         for(i = 1; i <= f;i ++)
 86         {
 87             scanf("%d",&temp);
 88             add(str,i,temp);
 89         }
 90         for(i = 1;i <= d;i ++)
 91         {
 92             scanf("%d",&temp);
 93             add(f+i,end,temp);
 94         }
 95         for(i = 1;i <= n;i ++)
 96         add(f+d+i,f+d+n+i,1);
 97         for(i = 0;i < n;i ++)
 98         {
 99             scanf("%s",food[i]);
100         }
101         for(i = 0;i < n;i ++)
102         {
103             scanf("%s",drink[i]);
104         }
105         for(i = 0;i < n;i ++)
106         {
107             for(j = 0;j < f;j ++)
108             {
109                 if(food[i][j] == 'Y')
110                 add(j+1,f+d+i+1,1);
111             }
112         }
113         for(i = 0;i < n;i ++)
114         {
115             for(j = 0;j < d;j ++)
116             {
117                 if(drink[i][j] == 'Y')
118                 add(f+d+n+i+1,f+j+1,1);
119             }
120         }
121         while(bfs())//注意这部分
122         {
123            while(res = dfs(str,INF))
124            ans+= res ;
125         }
126         printf("%d\n",ans);
127     }
128     return 0;
129 }

转载于:https://www.cnblogs.com/naix-x/archive/2013/05/08/3066148.html

HDU 4292 Food(dinic +拆点)相关推荐

  1. HDU 4292 Food (成都赛区网络赛第五题,拆点网络流)

      题意:跟POJ3281基本上一样的拆点网络流. 建图:建一超级源点和一超级汇点,源点与食物相连,边权为其数量,汇点与饮料相连,边权也为其数量,把人分成两个点,之间的边权为1.每个人与之需要的食物和 ...

  2. hdu 4292 Food 最大流

    题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=4292 You, a part-time dining service worker in your c ...

  3. Food HDU - 4292 网络流

    题意: 有n个人,f种食物和d种饮料,每种饮料和食物的个数已知,假设一个人拿到一个自己喜欢的食物或饮料,那个人就会感到满足. 最多能有几个人满足? 思路:拆点建图. 一个人必须又要饮料又要食物,假设我 ...

  4. HDU - 4292 Food(最大流+思维建边)

    题目链接:点击查看 题目大意:作为食堂管理人,现在有n个学生需要打饭,每个学生需要一个饮料和食物才能满足,每个学生可以同时接受多种不同的食物和饮料,现在给出每种食物和饮料的个数,问最多能让多少学生满足 ...

  5. dinic (最大流) 算法 讲解

    网络流入门-用于最大流的Dinic算法 转自:http://comzyh.tk/blog/archives/568/ "网络流博大精深"-sideman语 一个基本的网络流问题 感 ...

  6. CH - 6801 棋盘覆盖(二分图最大匹配+奇偶拆点)

    题目链接:点击查看 题目大意:给出一个n*n的棋盘,我们需要尽可能多地放置1*2大小的方块,有一些位置是不允许摆放的,问最多能放多少方块 题目分析:看到1*2大小的方块,就直接联想到之前状压dp的那个 ...

  7. 解题报告:【kuangbin带你飞】专题十一 网络流

    目录 A.POJ 3436 ACMComputerFactoryACM\ Computer\ FactoryACM Computer Factory[省选/NOI- ] B.POJ 3281 Dini ...

  8. 2012成都网络赛赛后【缺CHJ】

    A Coder (HDU 4288,与Codeforces 85D相同) 应该用线段树写,我是块状链表水过了 #include<map>#include<cstdio>#inc ...

  9. kuangbin带你飞专题合集

    题目列表 [kuangbin带你飞]专题一 简单搜索 [kuangbin带你飞]专题二 搜索进阶 [kuangbin带你飞]专题三 Dancing Links [kuangbin带你飞]专题四 最短路 ...

最新文章

  1. Linux之tee命令
  2. unet_3plus
  3. golang中的base64
  4. [YTU]_2630 ( E2 驾驭const)
  5. bst latex 最大作者数_latex 参考文献作者是三个以上时如何处理?
  6. (转)如果知道dll文件是面向32位系统还是面向64位系统的?
  7. Exynos4412 中断驱动开发(二)—— 中断处理流程分析
  8. 腾讯自研分布式远程Shuffle服务Firestorm正式开源
  9. ASP.NET Core 系列视频完结,新项目实战课程发布。
  10. 【转】Cron表达式简介
  11. struts validator 基本知识 之 【出现错误信息的条数】。
  12. hive内部表与外部表入门
  13. python爬取学校题库_利用Python网络爬虫爬取学校官网十条标题
  14. html+css美化后台登录界面
  15. Redis-使用场景
  16. 算法基础课【合集2】
  17. 第八章 可扩展标记语言XML
  18. 土地调查图斑编号_第三次全国国土调查内业信息提取相关表、记录表、图斑、专项用地调查标注内容及代码...
  19. USB3.1HUB驱动芯片VL822
  20. Linux自学网站推荐

热门文章

  1. 使用 Python 从零开始开发区块链应用程序
  2. mac gource_如何使用Gource显示项目的时间表
  3. 软件开发向大数据开发过渡_如果您是过渡到数据科学的开发人员,那么这里是您的最佳资源...
  4. mysqlls_mysql基本命令
  5. 1012 The Best Rank
  6. Python控制结构总结
  7. 如何挑选靠谱的Java培训机构
  8. 计算机应用基础第三章操作步骤,最新江西三校生计算机应用基础模拟操作题集锦(超实用!)...
  9. 二、python小功能记录——监听鼠标事件
  10. 百度成立小度蓝牙联盟,DMA+小度App打造蓝牙语音风口