Ejemplo n.º 1
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);
}
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;
}
Ejemplo n.º 3
0
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;
}
Ejemplo n.º 4
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;
}
Ejemplo n.º 5
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;
}
Ejemplo n.º 6
0
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;
}
Ejemplo n.º 7
0
void solve()
{
	int ans=g.MaxFlow(S,T);
	printf("%d\n",ans);
}