Exemple #1
0
bool solve(int n,int num)
{
    int maxx=n*(n-1)/2,s=0,t=n+maxx+1;
    bool win[N]={0};
    g.Clearall();
    g.Resize(t+1);
    for(int i=1; i<=n; i++)
        g.Addedge(s,i,score[i]);
    for(int j=1; j<=maxx; j++)
        g.Addedge(j+n,t,1);
    for(int i=n-num+1; i<=n; i++)
        for(int j=first_great[i]; j<=n; j++)
        {
            win[match_num[i][j]]=true;
            g.Addedge(i,n+match_num[i][j],1);
        }
    for(int i=1; i<=n; i++)
        for(int j=1; j<=n; j++)
            if(i!=j&&win[match_num[i][j]]==false)
                g.Addedge(i,match_num[i][j]+n,1);
    int ans=g.MaxFlow(s,t);
    if(ans==maxx)
        return true;
    return false;
}
Exemple #2
0
  int main()
  {
    int Num,Edgenum;
    while(~scanf("%d%d",&Edgenum,&Num))
    {
        g.ClearAll(Num);

        for(int i=0;i<Edgenum;i++)
        {
          int st,ed,cost;
          scanf("%d%d%d",&st,&ed,&cost);st--;ed--;
          g.AddEdge(st,ed,cost);
        }

        int ans=g.MaxFlow(0,Num-1);
        printf("%d\n",ans);
    }

    return 0;
  }
int check(double g)
{
    mf.ClearAll(n+2);
    memset(deg, 0, sizeof(deg));
    for(int i=1; i<=n; i++)
        for(int j = i+1; j <= n; j++)
            if(a[j] < a[i]) mf.AddEdge(i, j, 1), mf.AddEdge(j, i, 1), deg[i]++, deg[j]++;
    for(int i=1; i<=n; i++)
        mf.AddEdge(source, i, U);
    for(int i=1; i<=n; i++)
        mf.AddEdge(i, sink, g*2.0 + 1.0*U - 1.0*deg[i]);
    double curf = mf.Maxflow(source, sink);
    return dcmp((U*n - curf)/2.0);
}
int main()
{
	int T,n,m,sum=0;
	read(T);
	for(int cas=1;cas<=T;cas++)
	{
		read(n),read(m);sum=0;
		g.Clearall();
		g.Resize(n+m+2);
		for(int i=1,u;i<=n;i++)
		{
			read(u);g.Addedge(0,i,u);
			sum+=u;
		} 
		for(int i=1,u;i<=m;i++)
		{
			read(u);g.Addedge(n+i,n+m+1,u);
		}
		for(int i=1,k;i<=n;i++)
		{
	    	read(k);
	    	for(int j=0,a;j<k;j++)
			{
	    		read(a);
	    		g.Addedge(i,n+a+1,INF);
	    	}
	    }
	    for(int i=1,a;i<=m;i++)
    		for(int j=1;j<=m;j++)
			{
		    	read(a);
		    	if(a)
					g.Addedge(n+i,n+j,INF);
		    }
	    printf("Case #%d: ",cas);
	    printf("%d\n",sum-g.MaxFlow(0,n+m+1));
	}
	return 0;
}