您的位置:首页 > 其它

HDU 4292 Food(dinic +拆点)

2013-05-08 08:55 246 查看
题目链接

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

#include <cstdio>
#include <cstring>
#include <queue>
#include <map>
#include <iostream>
using namespace std;
#define INF 0x3fffffff
char food[201][201],drink[201][201];
struct node
{
int u,v,next,re,w;
}edge[200001];
int first[2001],dis[2001];
int t,str,end;
void CL()
{
t = 1;
memset(first,-1,sizeof(first));
}
void add(int u,int v,int w)
{
edge[t].u = u;
edge[t].v = v;
edge[t].w = w;
edge[t].re = t+1;
edge[t].next = first[u];
first[u] = t++;
edge[t].u = v;
edge[t].v = u;
edge[t].w = 0;
edge[t].re = t-1;
edge[t].next = first[v];
first[v] = t ++;
}
int bfs()
{
int u,v,i;
memset(dis,0xff,sizeof(dis));
queue<int> que;
que.push(str);
dis[str] = 0;
while(!que.empty())
{
u = que.front();
que.pop();
for(i = first[u];i != -1;i = edge[i].next)
{
v = edge[i].v;
if(edge[i].w > 0&&dis[v] < 0)
{
dis[v] = dis[u] + 1;
que.push(v);
}
}
}
if(dis[end] > 0) return 1;
else return 0;
}
int dfs(int u,int step)
{
int i,temp,v,tf = 0;
if(u == end) return step;
for(i = first[u];i != -1;i = edge[i].next)
{
v = edge[i].v;
if(edge[i].w > 0&&dis[v] == dis[u] + 1&&(temp = dfs(v,min(step,edge[i].w))))
{
edge[i].w -= temp;
edge[edge[i].re].w += temp;
return temp;
}
}
if(!tf) dis[u] = -1;//注意这里
return tf;
}
int main()
{
int i,j,res,ans,n,f,d,temp;
while(scanf("%d%d%d",&n,&f,&d)!=EOF)
{
ans = 0;
str = 0;
end = 2000;
CL();
for(i = 1; i <= f;i ++)
{
scanf("%d",&temp);
add(str,i,temp);
}
for(i = 1;i <= d;i ++)
{
scanf("%d",&temp);
add(f+i,end,temp);
}
for(i = 1;i <= n;i ++)
add(f+d+i,f+d+n+i,1);
for(i = 0;i < n;i ++)
{
scanf("%s",food[i]);
}
for(i = 0;i < n;i ++)
{
scanf("%s",drink[i]);
}
for(i = 0;i < n;i ++)
{
for(j = 0;j < f;j ++)
{
if(food[i][j] == 'Y')
add(j+1,f+d+i+1,1);
}
}
for(i = 0;i < n;i ++)
{
for(j = 0;j < d;j ++)
{
if(drink[i][j] == 'Y')
add(f+d+n+i+1,f+j+1,1);
}
}
while(bfs())//注意这部分
{
while(res = dfs(str,INF))
ans+= res ;
}
printf("%d\n",ans);
}
return 0;
}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: