Exemplo n.º 1
0
void buildgraph()
{
	for(int i=1;i<=M;i++)
		scanf("%d",&pig_num[i]);
	S=0;T=N+1;Num=T+1;
	g.ClearAll(Num);
	memset(hash,0,sizeof(hash));
	for(int i=1;i<=N;i++)
	{
		int Qnum;
		scanf("%d",&Qnum);
		for(int j=1;j<=Qnum;j++)
		{
			int a;
			scanf("%d",&a);
			if(hash[a]==0)
			{
				g.AddEdge(S,i,pig_num[a]);
				hash[a]=i;
			}else
			{
				g.AddEdge(hash[a],i,INF);
			}
		}
		scanf("%d",&people_need[i]);
	}
	for(int i=1;i<=N;i++)
		g.AddEdge(i,T,people_need[i]);
}
Exemplo n.º 2
0
int main() {
  int T, d, f, b;
  scanf("%d", &T);
  while(T--) {
    scanf("%d%d%d%d%d", &w, &h, &d, &f, &b);
    for(int i = 0; i < h; i++) scanf("%s", pool[i]);
    int cost = 0;
    for(int i = 0; i < h; i++) {
      if(pool[i][0] == '.') { pool[i][0] = '#'; cost += f; }
      if(pool[i][w-1] == '.') { pool[i][w-1] = '#'; cost += f; }
    }
    for(int i = 0; i < w; i++) {
      if(pool[0][i] == '.') { pool[0][i] = '#'; cost += f; }
      if(pool[h-1][i] == '.') { pool[h-1][i] = '#'; cost += f; }
    }
    g.init(h*w+2);
   
    for(int i = 0; i < h; i++)
      for(int j = 0; j < w; j++){
        if(pool[i][j] == '#') { // grass
          int cap = INF;
          if(i != 0 && i != h-1 && j != 0 && j != w-1) cap = d;
          g.AddEdge(h*w, ID(i,j), cap); // s->grass, cap=d or inf
        } else { // hole
          g.AddEdge(ID(i,j), h*w+1, f); // hole->t, cap=f
        }
        if(i > 0)   g.AddEdge(ID(i,j), ID(i-1,j), b);
        if(i < h-1) g.AddEdge(ID(i,j), ID(i+1,j), b);
        if(j > 0)   g.AddEdge(ID(i,j), ID(i,j-1), b);
        if(j < w-1) g.AddEdge(ID(i,j), ID(i,j+1), b);
      }
    printf("%d\n", cost + g.Maxflow(h*w, h*w+1));
  }
  return 0;
}
Exemplo n.º 3
0
void run()
{
    scanf("%d%d",&n,&d);
    for(int i=1;i<=n;i++)
        scanf("%s",g1[i]+1);
    for(int i=1;i<=n;i++)
        scanf("%s",g2[i]+1);
    m=strlen(g1[1]+1);
    for(int i=1;i<=n;i++)
        for(int j=1;j<=m;j++)
            g1[i][j]-='0';
    dinic.init(t);
    int sum = 0;
    for(int i=1;i<=n;i++)
        for(int j=1;j<=m;j++)
        {
            if(g1[i][j]==0) continue;
            int u1 = id_p(i,j);
            int u2 = u1^1;
            dinic.AddEdge(u1,u2,g1[i][j]);
            for(int x=i-d;x<=i+d;x++)
                for(int y=j-d;y<=j+d;y++)
            {
                if(abs(x-i)+abs(y-j)>d || (x==i && y==j)) continue;
                if(!inside(x,y))
                {
                    dinic.AddEdge(u2,t,g1[i][j]);
                    goto bk;
                }
                else
                {
                    dinic.AddEdge(u2,id_p(x,y),g1[i][j]);
                }
            }
            bk:;
        }
    for(int i=1;i<=n;i++)
        for(int j=1;j<=m;j++)
        {
            if(g2[i][j]!='L')  continue;
            if(g1[i][j]==0 && canout(i,j))  continue;
            sum++;
            dinic.AddEdge(s,id_l(i,j),1);
            dinic.AddEdge(id_l(i,j),id_p(i,j),1);
        }
    int ans = sum - dinic.Maxflow(s,t);
    printf("Case #%d: ",cas++);  //cout<<sum<<' ';
    if(ans==0)  puts("no lizard was left behind.");
    else if(ans==1)  puts("1 lizard was left behind.");
    else printf("%d lizards were left behind.\n",ans);
}
Exemplo n.º 4
0
void BuildGraph(int n, int m) {
	S = 0, T = n + n + 1;
	net.Init(S + T + 1);
	for (int i = 0; i < n; ++i) {
		int c = CountBit(i);
		if (c & 1) {
			net.AddEdge(S, i + 1, Less[i]);
			net.AddEdge(i + 1 + n, T, More[i]);
		} else {
			net.AddEdge(S, i + 1, More[i]);
			net.AddEdge(i + 1 + n, T, Less[i]);
		}
		net.AddEdge(i + 1, i + 1 + n, INF);
		for (int j = i + 1; j < n; ++j) {
			if (CountBit(i ^ j) == 1) {
				if (c & 1) {
					net.AddEdge(i + 1, j + 1 + n, u[i] ^ u[j]);
				} else {
					net.AddEdge(j + 1, i + 1 + n, u[i] ^ u[j]);
				}
			}
		}
	}
	net.MaxFlow(S, T);
}
Exemplo n.º 5
0
double buildgraph(double mid)
{

	g.ClearAll(Num);

	for(int i=1;i<=N;i++)
	{
		g.AddEdge(S,i,M+0.0);
		g.AddEdge(i,T,M+2*mid-degree[i]);
	}

	for(int i=1;i<=M;i++)
	{
		int u=path[i].u;
		int v=path[i].v;
		g.AddEdge(u,v,1.0);
		g.AddEdge(v,u,1.0);
	}
	double floow=g.MaxFlow(S,T);
	return (M*N-floow)/2;
}
bool judge(double mid)
{
	double ans=0;
	g.ClearAll(Num);
	for(int i=1;i<=M;i++)
	{
		if(data[i].d<=mid)
			ans+=data[i].d-mid;
		else
		{
			g.AddEdge(data[i].u,data[i].v,data[i].d-mid);
			g.AddEdge(data[i].v,data[i].u,data[i].d-mid);
		}
	}
	ans+=g.MaxFlow(S,T);
	if(ans>=0/*||fabs(ans-0)<=eps*/)
	{
		return true;
	}
	return false;
}