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 }

 

 

你可能感兴趣的:(dinic)