HDU 4292 Food(dinic +拆点)

题目链接

我做的伤心了,不知是模版效率低,还是错了,交上就是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 }

 

 

posted @ 2013-05-08 08:55  Naix_x  阅读(268)  评论(0编辑  收藏  举报