Exemple #1
0
void dfs(Node *p,int flag)
{
    if(flag)
    {
        if(p->ln[0])
        {
            g.addedge(p->ln[0]-su.rt+pre.cnt,p-su.rt+pre.cnt,p->ln[0]->cost);
            dfs(p->ln[0],1);
        }
        if(p->ln[1])
        {
            g.addedge(p->ln[1]-su.rt+pre.cnt,p-su.rt+pre.cnt,p->ln[1]->cost);
            dfs(p->ln[1],1);
        }
    }
    else
    {
        if(p->ln[0])
        {
            g.addedge(p-pre.rt,p->ln[0]-pre.rt,p->ln[0]->cost);
            dfs(p->ln[0],0);
        }
        if(p->ln[1])
        {
            g.addedge(p-pre.rt,p->ln[1]-pre.rt,p->ln[1]->cost);
            dfs(p->ln[1],0);
        }
    }
}
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("");
    }
}
bool solve(void)
{
    int flowneed = 0;
    for(int i=1;i<=n;++i) {
        deg[i] = out[i] - in[i];
        if(deg[i]%2!=0) return false;
        if(deg[i]>0) dinic.addedge(0,i,deg[i]/2);
        else if(deg[i]<0) dinic.addedge(i,n+1,-deg[i]/2);
        flowneed += deg[i]>0 ? deg[i]/2 : 0;
    }
    return flowneed==dinic.maxFlow(0,n+1);
}
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 #6
0
void build()
{
    for(int i=1; i<=n; i++)
        g.addedge(pre.pos[i],su.pos[i]+pre.cnt,INF);
    dfs(pre.rt,0);
    dfs(su.rt ,1);
}
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;
}
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);
    }
}