Exemple #1
0
void write()
{
     if (!m)
     {
        printf("%d\n%d\n",1,1);
        return;
     }
     int L=0*XX,R=m*XX,best;
     do
     {
       int mid=(L+R)>>1;
       build_network(mid);
       int g=m*XX-sap();
       if (g<=0) R=mid;
       else L=mid,best=L;
     }
     while (L+1!=R);
     build_network(best);
     sap();
     dfs(S);
     for (int i=0;i<n;i++)
         if (!visited[i]) total++;
     printf("%d\n",total);
     for (int i=0;i<n;i++)
         if (!visited[i])
            printf("%d\n",i+1);
}
Exemple #2
0
int judge(int ti)
{
	for(int i=1;i<=n;i++)
	for(int j=1;j<=m;j++)
	{
		int u=(i-1)*m+j;
		u=(ti-1)*m*n+2+u;
		if(mp[i][j]=='#')
		continue;
		for(int k=0;k<5;k++)
		{
			int x=i+di[k][0];
			int y=j+di[k][1];
			int v=(x-1)*m+y;
			v=ti*m*n+2+v;
			if(!in(x,y))
			continue;
			add(u,v,1);
		}
	}
	for(int i=1;i<=n;i++)
	for(int j=1;j<=m;j++)
	{
		int v=(i-1)*m+j;
		v=2+ti*m*n+v;
		if(mp[i][j]=='@')
		{
		 add(v,t,1);
      }
    }
	nn+=n*m;
	ans+=sap();
	return ans==sum;
}
Exemple #3
0
bool solve(bool flag)
{
	memset(g, 0, sizeof(g));
	memset(v, 0, sizeof(v));
	memset(h, 0, sizeof(h));
	S = 1; T = 2 * (n1 + n2 + 1) + 1;
	for(int i = 1; i <= n1; i++)
		for(int j = 1; j <= n2; j++)
			if(abs(a[i].a - b[j].a) < d)
			{
				g[O(a[i].idx)][I(b[j].idx)] = inf;
				g[O(b[j].idx)][I(a[i].idx)] = inf;
			}
	for(int i = 1; i <= n1; i++) g[I(a[i].idx)][O(a[i].idx)] = 1;
	for(int i = 1; i <= n2; i++) g[I(b[i].idx)][O(b[i].idx)] = 1;
	if(!flag)
	{
		std::sort(a+1, a+1+n1, cmp1); std::sort(b+1, b+1+n2, cmp2);
		for(int i = 1; i <= m; i++) g[S][I(a[i].idx)] = inf;
		for(int i = 1; i <= m; i++) g[O(b[i].idx)][T] = inf;
	}
	else {
		std::sort(a+1, a+1+n1, cmp2); std::sort(b+1, b+1+n2, cmp1);
		for(int i = 1; i <= m; i++) g[O(a[i].idx)][T] = inf;
		for(int i = 1; i <= m; i++) g[S][I(b[i].idx)] = inf;
	}
	v[0] = T;
	int maxflow = 0;
	while(h[S] < T) maxflow += sap(1, inf);
	//printf("flag = %d, res = %d\n",flag, maxflow);
	return maxflow >= m;
}
Exemple #4
0
void solve()
{
	int ans, num, i, j;
	ans = sap();
	printf("%d\n", ans);
	memset(cnt, 0, sizeof(cnt));
	dfs(st);
	num = 0;
	for(i = 0;i <= tot; i++)
	{
		if((i & 1)) continue;
		if(cnt[e[i].u] != cnt[e[i].v])
		{
			if(e[i].u == st)
			{
				num++;
				vec[num][0] = e[i].v;
				vec[num][1] = 0;
			}
			if(e[i].v == ed)
			{
				num++;
				vec[num][0] = e[i].u - n2;
				vec[num][1] = 1;
			}
		}
	}
	printf("%d\n", num);
	for(i = 1;i <= num; i++) printf("%d %c\n", vec[i][0], (vec[i][1] == 0 ? '-' : '+'));
}
Exemple #5
0
int main(){
	int f,d,n;
	while(~scanf("%d%d%d",&n,&f,&d)){
		gInit();
		V=2+f+d+n+n;
		int t;
		for(int i=0;i<f;i++){
			scanf("%d",&t);
			add_edge(0,2+i,t);
		}
		for(int i=0;i<d;i++){
			scanf("%d",&t);
			add_edge(2+f+i,1,t);
		}
		char ch[210];
		for(int j=0;j<n;j++){
			scanf("%s",ch);
			for(int i=0;i<f;i++){
				if(ch[i]=='Y')
					add_edge(2+i,2+f+d+j,1);
			}
		}
		for(int j=0;j<n;j++){
			scanf("%s",ch);
			for(int i=0;i<d;i++){
				if(ch[i]=='Y')
					add_edge(2+f+d+n+j,2+f+i,1);
			}
		}
		for(int j=0;j<n;j++)
			add_edge(2+f+d+j,2+f+d+n+j,1);
		printf("%d\n",sap(0,1));
	}
	return 0;
}
Exemple #6
0
	int sap(const int idx, const int maxCap)
	{
		if (idx == sink)
			return maxCap;
		int l = maxCap, d, minH = n;
		for (int i = 0; i < n; i++)
		{
			if (cap[idx][i] - flow[idx][i] > 0)
			{
				if (h[idx] == h[i] + 1)
				{
					d = sap(i, min(l, cap[idx][i] - flow[idx][i]));
					flow[idx][i] += d;
					flow[i][idx] -= d;
					l -= d;
					if (h[source] == n || l == 0) return maxCap - l;
				}
				minH = min(minH, h[i] + 1);
			}
		}
		if (l == maxCap)
		{
			vh[h[idx]]--;
			vh[minH]++;
			if (vh[h[idx]] == 0)
				h[source] = n;
			h[idx] = minH;
		}
		return maxCap - l;
	}
int main ()
{
    int n,m,u,v,p;
    int src,des;
    int sum;
    while (scanf("%d %d",&n,&m)!=EOF)
    {
        ep = 0;
        sum=0;
        src = 0;
        des = n + 1;
        memset (head,-1,sizeof(head));
        for(int i=1;i<=n;i++)
        {
            scanf("%d",&p);
            if(p>0)
            {
                addedge(src,i,p);
                sum+=p;
            }
            else
            addedge(i,des,-p);
        }
        for (int i=1; i<=m; i++)
        {
            scanf("%d%d",&u,&v);
            addedge(u,v,inf);
        }
        int max_flow=sap(src,des,n + 2);;
        printf("%d\n",sum-max_flow);
    }
    return 0;
}
Exemple #8
0
int main()
{
    init();
    sap();
    solve();
	return 0;
}
void work()
{
	build_map();
	int res=0;
	v[S]=T;
	while(h[S]<T) res+=sap(S,inf);
	printf("%d\n",lizard_tot-res);
}
Exemple #10
0
int main() {
	while (scanf("%d%d", &m, &n) != EOF) {
		init();
		for (int i = 0; i < m; ++i) {
			scanf("%d%d%d", &a, &b, &x);
			insert1(a, b, x);
		}
		printf("%d\n", sap(1,n));
	}
}
	int max_flow_graph::max_flow(int source, int sink) {
		std::fill(gap, gap + isize, 0);
		std::fill(lvl, lvl + isize, 0);
		gap[0] = isize;

		int ret = 0;
		while (lvl[source] < isize) {
			ret += sap(source, INT_MAX, source, sink); //idk why this even exists
		}
		return ret;
	}
	int maxFlow()
	{
		vh[0]=n;
		flowSum=0;
		while(gap[1]<n)
			{
			flag=false;
			minCap=INF;
			sap(org);
			}
		return flowSum;
	}
Exemple #13
0
// ----------------------------------------------
int sap(int v,int flow){
  if(v==T)return flow;
  int rec=0;
  for(edge *p=d[v];p;p=p->next)if(h[v]==h[p->t]+1&&p->f){
      int ret=sap(p->t,min(flow-rec,p->f));
      p->f-=ret;p->pair->f+=ret;d[v]=p;
      if((rec+=ret)==flow)return flow;
    }
  d[v]=head[v];
  if(!(--gap[h[v]]))h[S]=T;
  gap[++h[v]]++;
  return rec;
}
Exemple #14
0
void work()
{
    int maxl=oo;
    s=0,t=n+1;
    for(int i=1; i<=k; ++i)
        spfa(i);
//		for(int i=1;i<=n;++i) for(int j=1;j<=n;++j) printf("%d %d %d\n",i,j,f[i][j]);
//	for(int i=1;i<=n;++i) for(int j=1;j<=n;++j) if(f[i][j]<1000000) maxl=max(maxl,f[i][j]);
    int left=0,right=maxl,ans,mid;
    while(left<right-1)
    {
        mid=left+right>>1;
        if(sap(mid)) right=mid;
        else left=mid;
    }
    while(sap(right))
    {
        ans=right;
        --right;
    }
    printf("%d\n",ans);
}
Exemple #15
0
	int solve(int source, int sink)
	{
		if (source == sink) return inf;
		this->sink = sink;
		this->source = source;
		memset(flow, 0, sizeof(flow));
		memset(h, 0, sizeof(h));
		memset(vh, 0, sizeof(vh));
		int ans = 0;
		while (h[source] != n)
			ans += sap(source, inf);
		return ans;
	}
int sap(int x,int flow)
{
	if(x==T) return flow;
	int res=0;
	for(int i=0;i<=T;i++)
		if(g[x][i] && h[x]==h[i]+1)
		{
			int t=sap(i,min(g[x][i],flow-res));
			g[x][i]-=t; g[i][x]+=t;
			if((res+=t)==flow) return res;
			if(h[S]>=T) return res;
		}
	if(!(--v[h[x]])) h[S]=T;
	++v[++h[x]];
	return res;
}
int main()
{
    int u,v,len;
    int i,m;
    while(scanf("%d%d",&m,&n)!=EOF)
    {
        init();
        for(i=0;i<m;i++)
        {
            scanf("%d%d%d",&u,&v,&len);
            add(u,v,len);
        }
        printf("%d\n",sap(1,n));
    }
    return 0;
}
void solve() {
    n = id_col + id_row + 2;
    int s = n - 1, t = n;
    init();
    for(int i = 0 ; i < nn ;i++)
        for(int f = 0 ; f < m;f++)
            if(true == white[i][f]) {
                pos[i][f] = size;
                add(getcol(i,f),getrow(i,f) + id_col,8);
            }
    for(int i = 1;i <= id_col ;i++)
        add(s,i,flow_col[i]);
    for(int i = 1;i <= id_row; i++)
        add(id_col+i, t, flow_row[i]);
    sap(s,t);
    ans();
}
Exemple #19
0
void solve()
{
	int64 max = 200000000000ll;
	int64 high = max;
	int64 low = 0;
	int64 mid;
	int res;
	while(low < high)
	{
		mid = (low + high) / 2;
		build(mid);
		res = sap();
		if(res >= sum) high = mid;
		else low = mid + 1;
	}
	printf("%lld\n", low == max ? -1 : low);
}
Exemple #20
0
void solve()
{
	int flag, i;
	flag = 1;
	for(i = 1;i <= num; i++)
	{
		memset(flow, 0, sizeof(flow));
		if(sap(0, i * 2 - 1) == sum)
		{
			if(flag) printf("%d", i - 1);
			else printf(" %d", i - 1);
			flag = 0;
		}
	}
	if(flag == 0) printf("\n");
	else printf("-1\n");
}
int solve() {
    n = nn+mm+2;
    int s = n-1;
    int t = n;
    init();
    for(int i = 0 ;i < nn;i++) {
        for(int f = 0;f < mm;f++) {
            int dis = (guest[i][0] - umb[f][0])*(guest[i][0] - umb[f][0]) + (guest[i][1] - umb[f][1])*(guest[i][1] - umb[f][1]);
            if(tt * tt * guest[i][2] * guest[i][2] >= dis)
                add(1+i,nn+1+f,1);
        }
    }
    for(int i = 1;i <= nn;i++)
        add(s,i,1);
    for(int i = nn+1;i <= nn+mm;i++)
        add(i,t,1);
    return sap(s,t);
}
int main()
{
    int u,v;
    int tem,sum,s,t;
    string ch,ch2;
    int f,i,cas;
    scanf("%d",&cas);
    for(i=0;i<cas;i++)
    {
        init();
        mp.clear();
        ji=0;
        n=802;
        s=801;
        t=802;
        scanf("%d",&tem);
        for(f=0;f<tem;f++)
        {
            cin>>ch;
            u=id(ch);
            add(s,u,1);
        }
        scanf("%d",&sum);
        for(f=0;f<sum;f++)
        {
            cin>>ch>>ch2;
            u=id(ch2);
            add(u,t,1);
        }
        scanf("%d",&tem);
        for(f=0;f<tem;f++)
        {
            cin>>ch>>ch2;
            u=id(ch);
            v=id(ch2);
            add(v,u,INF);
        }
        if(0 != i)
            printf("\n");
        printf("%d\n",sum-sap(s,t));
    }
    return 0;
}
	void sap(int pos)
	{
		if(pos==snk)
			{
			flowSum+=minCap;
			flag=true;
			return;
			}
		int i;
		int minGap=n-1;
		int tmpCap=minCap;
		for(i=1;i<=n;i++)
			if(cap[pos][i])
				{
				if(gap[i]+1==gap[pos])
					{
					if(cap[pos][i]<minCap)
						minCap=cap[pos][i];
					sap(i);
					if(gap[1]>=n)return;
					if(flag)break;
					minCap=tmpCap;
					}
				if(gap[i]<minGap)
					minGap=gap[i];
				}
		if(flag)
			{
			cap[pos][i]-=minCap;
			cap[i][pos]+=minCap;
			}
		else
			{
			vh[gap[pos]]--;
			if(vh[gap[pos]]==0)gap[1]=n;
			gap[pos]=minGap+1;
			vh[gap[pos]]++;
			}
	}
void ScreenLayoutManager::AdjustToSafeAreaProportional( Vec2& p, Vec2& s, const float assetAspect,
                                                        const EUIDRAWHORIZONTAL eUIDrawHorizontal,        
                                                        const EUIDRAWVERTICAL   eUIDrawVertical,
                                                        const EUIDRAWHORIZONTAL eUIDrawHorizontalDocking, 
                                                        const EUIDRAWVERTICAL   eUIDrawVerticalDocking  ) const
{
	// Get the canvas aspect ratio
	const float canvasAspect = GetTagetSpaceAspect();

	//-----------------------------------------------
	// Get final asset size(w,h) in proportional space.
	s = GetAssetSizeAsProportionOfScreen( assetAspect, canvasAspect, s );

	//-----------------------------------------------
	// Get
	// at this point the p is at still the (center,left),
	// (top,left) or (bottom,right) of the asset.
	// Adjust canvas for borders
	if( !(m_flags & eSLO_DoNotAdaptToSafeArea) )
	{
		p = ScaleProportionalPositionInToSafeArea( p );
	}

	// Get the position of the pivot p in screen space 
	// when aligned/docked to the screen.
	Vec2 sap(1.0f,1.0f);
	if( !(m_flags & eSLO_DoNotAdaptToSafeArea) )
	{
		sap = GetSafeAreaScreenProportion(m_curSafeAreaID);
	}
	AlignToScreen( &p.x, &p.y, p.x, p.y, sap.x, sap.y, eUIDrawHorizontalDocking, eUIDrawVerticalDocking );

	// If we have a size get the TL point of the asset
	// after applying the align flags to the asset.
	// i.e. in the asset is centered about it's pivot
	// then the TL === p-s/2
	AlignAroundPivot( &p.x, &p.y, p.x, p.y, s.x, s.y, eUIDrawHorizontal, eUIDrawVertical );

}
int check(int round)
{    
    int s,t,i,f;
    n = nn + 2*mm +2;
    s = n-1;
    t = s+1;
    init();
    for(i = 1;i<=nn;i++)
        add(s,i,round);
    for(i = nn+1;i <= nn+mm;i++)
        add(i,i+mm,k);
    for(i = nn+mm+1;i<=nn+mm+mm;i++)
        add(i,t,round);
    for(i=1;i<=nn;i++)
        for(f=1;f<=mm;f++)
            if(1 == good[i][f])
                add(i,f+nn+mm,1);
            else 
                add(i,f+nn,1);
    if(nn*round == sap(s,t))
        return 1;
    return 0;
}
	int max_flow_graph::sap(int pos, int flow, int source, int sink) {
		if (pos == sink) {
			return flow;
		}
		int flow_left = flow;
		for (int a = head[pos]; a != -1; a = edges[a].n) {
			if (edges[a].c && lvl[edges[a].v] + 1 == lvl[pos]) {
				int cf = sap(edges[a].v, std::min(edges[a].c, flow_left), source, sink);

				flow_left -= cf;
				edges[a].c -= cf;
				edges[a ^ 1].c += cf;

				if (lvl[source] == isize || flow_left == 0) {
					return flow - flow_left;
				}
			}
		}
		int min_child = isize;
		for (int a = head[pos]; a != -1; a = edges[a].n) {
			if (edges[a].c) {
				min_child = std::min(min_child, lvl[edges[a].v]);
			}
		}

		if (flow == flow_left) {
			gap[lvl[pos]]--;
			if (gap[lvl[pos]] == 0) {
				lvl[source] = isize;
			} else {

				lvl[pos] = min_child + 1;
				gap[lvl[pos]]++;
			}
		}
		return flow - flow_left;
	}
Exemple #27
0
int main()
{
	int ttt,maxw=0;
	scanf("%d",&ttt);
	for(int times=1;times<=ttt;++times)
	{
		int tans=0;
		memset(day,0,sizeof(day));
		memset(d,0,sizeof(d));
		memset(w,0,sizeof(w));
		memset(v,0,sizeof(v));
		scanf("%d",&n);
		for(int i=1;i<=n;++i)
		{
			for(int j=1;j<=7;++j) scanf("%d",&day[i][j]);
			scanf("%d%d",&d[i],&w[i]);
			tans+=d[i];
			maxw=maxw<w[i]?w[i]:maxw;
		}
		s=0,t=n+maxw*7+1;
		for(int i=1;i<=n;++i)
		{
			v[s][i]=d[i];
			for(int j=1;j<=w[i];++j)
				for(int k=1;k<=7;++k)
					if(day[i][k])
					{
						v[i][(j-1)*7+n+k]=1;
						v[(j-1)*7+n+k][t]=1;
					}
		}
		sap();
		printf("%s\n",ans==tans?"Yes":"No");
	}
	return 0;
}
Exemple #28
0
void IterativeEdgeMatcher::_updateVertexScores(VertexScoreMap& vm, EdgeScoreMap &/*em*/)
{
  CostFunction cost;
  if (&vm == &_vertex12Scores)
  {
    cost.em1 = &_edge12Scores;
    cost.em2 = &_edge21Scores;
  }
  else
  {
    cost.em2 = &_edge12Scores;
    cost.em1 = &_edge21Scores;
  }
  cost.p = _p;

  // go through all vertex matches
  for (VertexScoreMap::iterator it = vm.begin(); it != vm.end(); ++it)
  {
    ConstNetworkVertexPtr v1 = it.key();
    cost.v1 = v1;

    QList<ConstNetworkEdgePtr> edges1 = _getEdgesOnVertex(v1);

    // Go through all the potential matching vertices
    QHash<ConstNetworkVertexPtr, double>& t2 = it.value();
    for (QHash<ConstNetworkVertexPtr, double>::iterator jt = t2.begin(); jt != t2.end(); ++jt)
    {
      Saps sap(cost);
      ConstNetworkVertexPtr v2 = jt.key();
      cost.v2 = v2;
      QList<ConstNetworkEdgePtr> edges2 = _getEdgesOnVertex(v2);

      // get all the neighboring edges for the first vertex.
      for (int i1 = 0; i1 < edges1.size(); ++i1)
      {
        sap.addActor(&(edges1[i1]));
      }

      // get all the neighboring edges for the second vertex.
      for (int i2 = 0; i2 < edges2.size(); ++i2)
      {
        sap.addTask(&(edges2[i2]));
      }

      // find the best match of scores between the two sets of edges
      vector<Saps::ResultPair> pairing = sap.calculatePairing();
      QList<double> scores;

      for (size_t i = 0; i < pairing.size(); ++i)
      {
        if (pairing[i].actor && pairing[i].task)
        {
          scores.append(cost.cost(pairing[i].actor, pairing[i].task));
        }
      }

      // aggregate the scores between the two sets of edges
      double edgeScore = pow(_aggregateScores(scores), _dampening) * _scoreVertices(v1, v2);

      // set this vertex pair's score to the new aggregated score.
      jt.value() = edgeScore;
    }
  }
}
Exemple #29
0
void work(){
	sap();
	printf("%.4lf\n",exp(1.0*ans));
}