HDU 4292 Food(dinic +拆点)
2013-05-08 08:55
246 查看
题目链接
我做的伤心了,不知是模版效率低,还是错了,交上就是TLE,找了份别人的代码,改了好几下终于过了。。
我做的伤心了,不知是模版效率低,还是错了,交上就是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; }
相关文章推荐
- hdu 4292 Food(Dinic)
- hdu-4292 Food(最大流)dinic
- HDU 4292 —— Food(最大流,拆点)
- HDU 4292 Food(最大流)
- HDU 4292 Food (最大流)
- Hdu 4292 Food.cpp 最大流+拆点
- HDU 4292 Food
- hdu 4292 Food 最大流+拆点
- POJ 3281 Dining & HDU 4292 Food【最大流】
- HDU 4292 Food 网络流最大流 拆点
- HDU 4292 Food (成都赛区网络赛第五题,拆点网络流)
- HDU 4292 Food(建图+最大流)
- hdu 4292 Food 【图论-网络流-最大流-Dinic】
- HDU 4292 Food 最大流 + 拆点
- HDU 4292 Food [网络流]
- HDU 4292 Food 最大流
- HDU 4292 Food 最大流
- HDU 4292--Food【最大流 && 拆点】
- hdu 4292(网络流)Food
- 【最大流】HDU 4292 Food