Beispiel #1
0
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]);
}
Beispiel #2
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;
}
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;
}