void solve(void)
{
    int totalp = 0;
    for(int i=0;i<n;++i) totalp += ni[i];
    for(int i=0;i<n;++i)
        for(int j=0;j<n;++j)
            if(hypot(x[i]-x[j],y[i]-y[j])<=D)
                mat[i][j] = 1;
            else
                mat[i][j] = 0;
    vector<int> ans;
    for(int zz=0;zz<n;++zz) {
        dinic.init(n*2+1);
        for(int i=0;i<n;++i)
            dinic.addedge(i,i+n,mi[i]);
        for(int i=0;i<n;++i)
            dinic.addedge(n*2,i,ni[i]);
        for(int i=0;i<n;++i)
            for(int j=0;j<n;++j)
                if(mat[i][j])
                    dinic.addedge(i+n,j,totalp);
        if(totalp==dinic.maxFlow(n*2,zz))
            ans.push_back(zz);
    }
    if(ans.empty())
        puts("-1");
    else {
        for(int i=0;i<(int)ans.size();++i) {
            if(i) putchar(' ');
            printf("%d",ans[i]);
        }
        puts("");
    }
}
Exemple #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;
}
bool check(int mid)
{
    source = n1+n2; sink = n1+n2+1;
    dinic.init(n1+n2+2);
    for(int i=0;i<n1;++i) dinic.addedge(source,i,1);
    for(int i=0;i<n2;++i) dinic.addedge(i+n1,sink,cap[i]);
    for(int i=0;i<n1;++i)
        for(int j=0;j<n2;++j)
            if(mat[i][j]<=mid)
                dinic.addedge(i,j+n1,1);
    dinic.maxFlow(source,sink);
    return dinic.totalflow==n1;
}
bool check(int mid)
{
    for(int z=0;z+mid-1<B;++z) {
        dinic.init(n+B+2);
        for(int i=0;i<n;++i) dinic.addedge(n+B,i,1);
        for(int i=0;i<B;++i) dinic.addedge(n+i,n+B+1,cap[i]);
        for(int i=z;i<z+mid;++i)
            for(int j=0;j<n;++j)
                dinic.addedge(j,n+prefer[j][i],1);
        if(dinic.maxFlow(n+B,n+B+1)==n) return true;
    }
    return false;
}
Exemple #5
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);
}
void input(void)
{
    scanf("%d%d",&n,&m);
    memset(deg,0,sizeof(deg));
    memset(out,0,sizeof(out));
    memset(in,0,sizeof(in));
    dinic.init(n+2);
    for(int i=0;i<m;++i) {
        int u,v,di;
        scanf("%d%d%d",&u,&v,&di);
        ++out[u];
        ++in[v];
        if(!di) dinic.addedge(u,v,1);
    }
}
void input()
{
    dinic.init();
    src = n+m; sink = src+1;
    for (int i=0; i<n; i++) {
        dinic.add_edge(src, i, 1);
        scanf("%s", line);
        while (getchar() != '\n') {
            scanf("%d", &x);
            dinic.add_edge(i, x+n, 1);
        }
    }
    sink_start = dinic.m;
    for (int i=0; i<m; i++) {
        dinic.add_edge(n+i, sink, n);
    }
    sink_end = dinic.m;
}
int getshortest(void)
{
    if(D>=W) return 1;
    build();
    dinic.init(MAXN);
    int totalcnt = 0;
    for(int tt=1;tt<=n+m;++tt) {
        for(int i=0;i<n;++i) if(jumpfroms[i]) dinic.addedge(id(source),id(instoneid[tt][i]),INF);
        for(int i=0;i<n;++i) dinic.addedge(id(instoneid[tt][i]),id(outstoneid[tt][i]),ci[i]);
        if(tt==1) continue;
        for(int i=0;i<n;++i) if(jumpfromt[i]) dinic.addedge(id(outstoneid[tt-1][i]),id(sink),INF);
        for(int i=0;i<n;++i)
            for(int j=0;j<n;++j)
                if(canjump[i][j])
                    dinic.addedge(id(outstoneid[tt-1][i]),id(instoneid[tt][j]),INF);
        dinic.maxFlow(source,sink);
        totalcnt += dinic.totalflow;
        if(totalcnt>=m) return tt;
    }
    return -1;
}
Exemple #9
0
int main() {
	int i, j, k;
	int s, t;
	int w;
	int m, n, f;
	int tc, cn(0);
	int tot, vt;
	int p;
	//freopen("f:\\in.txt", "r", stdin);
	scanf("%d", &tc);
	while (tc--) {
		scanf("%d %d %d", &n, &m, &f);
		s = 1, t = n + 1;
		dinic.init(s, t);
		for (i=0; i<m; ++i) {
			scanf("%d %d %d", x+i, y+i, &w);
			dinic.add_edge(x[i], y[i], w);
		}
		vt = 0;
		for (i=0; i<f; ++i) {
			scanf("%d %d", &k, &w);
			dinic.add_edge(k, t, w);
			vt += w;
		}
		tot = dinic.flow();
		vt -= tot;
		printf("Case %d: %d\n", ++cn, vt);
		k = dinic.cut(cut);
		for (i=0; i<=t; v[i++]=false);
		for (i=0; i<k; v[cut[i++]]=true);
		p = 0;
		for (i=0; i<m; ++i) {
			if (!v[x[i]] && v[y[i]]) res[p++] = i + 1;
		}
		printf("%d", p);
		for (i=0; i<p; ++i) printf(" %d", res[i]);
		puts("");
	}
	return 0;
}
Exemple #10
0
void solve() {
    mp[1].clear();
    mp[2].clear();
    int n1 = 0, n2 = 0;
    for(int i = 1; i <= n; i++) {
        if(mp[1][a[i][1]] == 0) {
            n1++;
            mp[1][a[i][1]] = n1;
            b[i][1] = n1;
        }
        else {
            b[i][1] = mp[1][a[i][1]];
        }
        if(mp[2][a[i][2]] == 0) {
            n2++;
            mp[2][a[i][2]] = n2;
            b[i][2] = n2;
        }
        else {
            b[i][2] = mp[2][a[i][2]];
        }
    }
    g.init();
    int st = n1 + n2 + 1, ed = st + 1;
    for(int i = 1; i <= n1; i++) {
        g.addEdge(st, i, 1);
    }
    for(int i = 1; i <= n2; i++) {
        g.addEdge(i + n1, ed, 1);
    }
    for(int i = 1; i <= n; i++) {
        g.addEdge(b[i][1], n1 + b[i][2], 1);
    }
    int ans = g.Maxflow(st, ed, INF);
    //printf("%d  %d %d\n", n1, n2, ans);
    printf("%d\n", n - (n2 - ans) - n1);
}