dinic求助
查看原帖
dinic求助
639198
Steve_xh楼主2024/9/13 13:31

只过了hack

#include<bits/stdc++.h>
#define int long long
#define inf (0x3f3f3f3f)
#define toi (e[i].to)
#define roi (e[i^1].to)
#define tow (e[i].w)
#define row (e[i^1].w)
#define fore(now,i,c) for(int i=c[now];~i;i=e[i].next)
using namespace std;
int m,n,k,head[2005],cur[2005],num[2005],dp[2005],cnt=-1,s,t,ans=0;
bool vis[2005];
struct EDGE{
	int to,next,w;
}e[50005<<1|1];
inline void init(){
	memset(head,-1,sizeof(head));
	memset(e,-1,sizeof(e));
}
inline void addedge(int u,int v,int w){
	e[++cnt].to=v;
	e[cnt].w=w;
	
	e[cnt].next=head[u];
	head[u]=cnt;
	
	e[++cnt].to=v;
	e[cnt].w=0;
	e[cnt].next=head[v];
	head[v]=cnt;
}
bool bfs(){
	for(int i=0;i<2005;i++)
		dp[i]=inf,cur[i]=head[i],vis[i]=false;
	queue<int> q;
	q.push(s);
	dp[s]=0;
	while(!q.empty()){
		int now=q.front();
		q.pop();
		if(vis[now])
			continue;
		vis[now]=true;
		fore(now,i,head)
			if(tow&&dp[toi]>dp[now]+1){
				dp[toi]=dp[now]+1;
				q.push(toi);
			}
	}
	return (dp[t]<inf);
}
int dfs(int now,int f){
	if(now==t){
		ans+=f;
		return f;
	}
	int used=0;
	fore(now,i,cur){
		cur[now]=i;
		if(tow&&dp[toi]==dp[now]+1){
			int t=dfs(toi,min(tow,f-used));
			if(!t)
				continue;
			used+=t;
			tow-=t;
			row+=t;
			if(used==f)
				break;
		}
	}
	return used;
}
void Dinic(){
	while(bfs())
		dfs(s,inf);
}
signed main(){
	init();
	scanf("%lld%lld",&k,&n);
	s=k+n+1,t=s+1;
	for(int i=1;i<=k;i++)
		scanf("%lld",num+i),addedge(i+n,t,num[i]),m+=num[i];
	for(int i=1;i<=n;i++)
		addedge(s,i,1);
	for(int i=1,p;i<=n;i++){
		scanf("%lld",&p);
		for(int j=1,t;j<=p;j++)
			scanf("%lld",&t),addedge(i,t+n,1);
	}
	Dinic();
	if(ans!=m){
//		printf("%lld\n",ans);
		puts("No Solution!");
		return 0;
	}
	for(int j=1;j<=k;j++,puts("")){
		printf("%lld:",j);
		for(int i=0;i<=cnt;i+=2){
			if(toi==s||toi==t||roi==s||roi==t)
				continue;
			if(toi==j+n&&row)
				printf(" %lld",roi);
		}
	}
	return 0;
}
2024/9/13 13:31
加载中...