コード例 #1
0
ファイル: poj1149.cpp プロジェクト: WERush/Poj
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]);
}
コード例 #2
0
int main()
{
	int n, m;

	while (cin >> n >> m, n && m) {
		Dinic<int, 501> dinic;

		vector<pair<int, int> > e;
		for (int i=0; i<m; i++) {
			int a, b, c;
			cin >> a >> b >> c;
			e.push_back(make_pair(a, b));
			dinic.add_multi(a, b, c);
		}

		dinic.exec(1, 2);

		for (int i=0; i<m; i++) {
			if ((dinic.level[e[i].first] != -1 && dinic.level[e[i].second] == -1) ||
				(dinic.level[e[i].first] == -1 && dinic.level[e[i].second] != -1)) {
				cout << e[i].first << " " << e[i].second << endl;
			}
		}
		cout << endl;
	}

	return 0;
}
コード例 #3
0
ファイル: HDU 5457 3.cpp プロジェクト: Mr-Phoebe/ACM-ICPC
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);
        }
    }
}
コード例 #4
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("");
    }
}
コード例 #5
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);
}
コード例 #6
0
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);
}
コード例 #7
0
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;
}
コード例 #8
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;
}
コード例 #9
0
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);
    }
}
コード例 #10
0
ファイル: HDU 5457 3.cpp プロジェクト: Mr-Phoebe/ACM-ICPC
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);
}
コード例 #11
0
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;
}
コード例 #12
0
int main()
{
	int i,j,count;
	while(scanf("%d",&n) != EOF)
	{
		fun();
		Dinic flow;
		for(i=1 ; i <= n ; ++i){
			if(dp[i]==1) flow.insert(0,i,1);
			if(dp[i]==len) flow.insert(i,n+1,1);
			for(j=i+1 ; j <= n ; ++j)
				if(a[j] > a[i])
					flow.insert(i,j,1);
		}
		printf("%d\n%d\n",len,flow.MaxFlow(0,n+1));
	}
	return 0;
}
コード例 #13
0
bool check(int f)
{
    for (int i=sink_start; i<sink_end; i+=2) {
        dinic.edges[i].cap = f;
    }
    for (int i=0; i<dinic.m; i++) {
        dinic.edges[i].flow = 0;
    }
    return dinic.maxflow(src, sink) == n;
}
コード例 #14
0
ファイル: HDU 5457 3.cpp プロジェクト: Mr-Phoebe/ACM-ICPC
int main()
{
    //freopen("data.txt","r",stdin);
    int T,cas=1;
    read(T);
    while(T--)
    {
        read(n),read(m);
        pre.init();su.init();g.Clear();
        for(int i=1,x; i<=n; i++)
        {
            read(x);
            for(int j=0; j<8; j++)
                if(x&(1<<7-j))  a[j]=1;
                else    a[j]=0;
            pre.insert(a,i);
            for(int j=0; j<8; j++)
                if(x&(1<<j))    a[j]=1;
                else    a[j]=0;
            su.insert(a,i);
        }
        g.Resize(pre.cnt+su.cnt);
        ss=0;
        tt=pre.cnt;
        for(int i=1,cost; i<=m; i++)
        {
            scanf("%s %s %d",str,x,&cost);
            if(str[0]=='P') pre.find(x,cost);
            else
            {
                int len=strlen(x);
                reverse(x,x+len);
                su.find(x,cost);
            }
        }
        build();
        //g.print();
        ll ans=g.MaxFlow(ss,tt);
        printf("Case #%d: %lld\n",cas++,ans>=INF?-1:ans);
    }
    return 0;
}
コード例 #15
0
ファイル: P1345.cpp プロジェクト: atubo/codeforces
int main() {
    scanf("%d%d%d%d", &N, &M, &C1, &C2);
    Dinic dinic;
    dinic.addEdge(2*C1, 2*C1+1, Dinic::inf);
    dinic.addEdge(2*C2, 2*C2+1, Dinic::inf);

    for (int i = 1; i <= M; i++) {
        int u, v;
        scanf("%d%d", &u, &v);
        dinic.addEdge(2*u+1, 2*v, Dinic::inf);
        dinic.addEdge(2*v+1, 2*u, Dinic::inf);
    }
    for (int i = 1; i <= N; i++) {
        if (i != C1 && i != C2) {
            dinic.addEdge(2*i, 2*i+1, 1);
        }
    }

    printf("%d\n", dinic.dinic(2*C1, 2*C2+1));
    return 0;
}
コード例 #16
0
ファイル: P3041.cpp プロジェクト: atubo/codeforces
int main() {
    int N, K;
    scanf("%d%d", &N, &K);

    Dinic dinic;
    const int S = 0, T = 2*N + 1;
    for (int i = 1; i <= N; i++) {
        dinic.addEdge(S, i, 1);
    }
    for (int i = N+1; i <= 2*N; i++) {
        dinic.addEdge(i, T, 1);
    }

    for (int i = 0; i < K; i++) {
        int r, c;
        scanf("%d%d", &r, &c);
        dinic.addEdge(r, N+c, Dinic::inf);
    }
    printf("%d\n", dinic.dinic(S, T));
    return 0;
}
コード例 #17
0
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;
}
コード例 #18
0
ファイル: poj3155.cpp プロジェクト: WERush/Poj
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;
}
コード例 #19
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;
}
コード例 #20
0
ファイル: UVa1515.cpp プロジェクト: Guhaifudeng/aoapc-bac2nd
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;
}
コード例 #21
0
ファイル: Aizu2304.cpp プロジェクト: VarickQ/ACM
int main(){
	int n,m,a,b,s,t;
	while( scanf("%d%d", &n, &m) != EOF ){
		Dinic mf;
		for(int i=0 ; i < m ; ++i){
			scanf("%d%d", &a, &b);
			mf.insert( a, b, 1 );
		}
		scanf("%d%d", &s, &t);
		printf("%d\n", mf.MaxFlow(s,t));

		CLR( ans, 0 );
		int cnt = 0;
		for(int i=0 ; i < mf.end ; ++i)
			if( net[i].val > 1 )
				if( i%2 == 0 )
					ans[cnt++] = i/2+1;
		printf("%d\n", cnt);
		for(int i=0 ; i < cnt ; ++i)
			printf("%d\n", ans[i]);
	}
	return 0;
}
コード例 #22
0
ファイル: C1.cpp プロジェクト: SyncShinee/ACM-ICPC
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);
}
コード例 #23
0
ファイル: main.cpp プロジェクト: someblue/ACM
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);
}
コード例 #24
0
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;
}
コード例 #25
0
ファイル: poj1149.cpp プロジェクト: WERush/Poj
void solve()
{
	int ans=g.MaxFlow(S,T);
	printf("%d\n",ans);
}
コード例 #26
0
ファイル: c.cpp プロジェクト: caiwaifung/algo
	T compute() {
		T ans=0; while(build()) ans+=find(src, INFI); return ans;
	}
	T getFlow(int x, int y) {
		for(Edge *e=g[x]; e; e=e->next)
			if(e->y==y)
				return e->oppo->w;
		return 0;
	}
};

// ------------------------ template ends here ------------------------ //
const int MAXN=222;
const int MAXE=MAXN+MAXN*MAXN;

Dinic<MAXN, MAXE, int, 1<<30> dinic;
int n, a[MAXN], ai[MAXN];

bool isPrime(int x) {
	for(int y=2; y*y<=x; ++y)
		if(x%y==0)
			return false;
	return true;
}

int main() {
	cin>>n; forint(i, 1, n) cin>>a[i];
	dinic.init();
	forint(i, 1, n) ai[i]=dinic.newNode();
	forint(i, 1, n) if(a[i]%2==0) dinic.addEdge(dinic.s(), ai[i], 2, 0);
	forint(i, 1, n) if(a[i]%2==1) dinic.addEdge(ai[i], dinic.t(), 2, 0);
コード例 #27
0
ファイル: C.cpp プロジェクト: sekiya9311/Programming-Contest
 REP(i, N) {
     mf.add_edge(st, i, 1);
     mf.add_edge(N + i, ed, 1);
 }
コード例 #28
0
ファイル: C.cpp プロジェクト: sekiya9311/Programming-Contest
 REP(i, N) REP(j, N) {
     if (a[i] < c[j] && b[i] < d[j]) {
         mf.add_edge(i, N + j, 1);
     }
 }