9pts , 过不了样例,请求大佬指正,悬关
查看原帖
9pts , 过不了样例,请求大佬指正,悬关
995786
immortal_楼主2023/10/27 14:39
#include<bits/stdc++.h>
using namespace std;
#define ll long long
const ll INF=2147483600;
const int MAXN=100,M=1000005;
int n,m,s,k,t;
int p[MAXN],Num[M],mp[MAXN][MAXN],fa[M],dep[M],now[M],head[MAXN];
int tot=1,Mx=0,Ans=1;
struct node{
	int v,nex,w;
}e[M<<1];
void add_edge(int u,int v,int val){
	e[++tot].v=v;
	e[tot].w=val;
	e[tot].nex=head[u];
	head[u]=tot;
}
int find(int x){
	return fa[x]==x?x:fa[x]=find(fa[x]);
}
void Merge(int x,int y){
	x=find(x),y=find(y);
	if(x==y) return ;
	fa[x]=y;
}
bool bfs(){
	for(int i=1;i<=Ans*(n+1);i++){
		dep[i]=INF;
	}
	dep[s]=0; now[s]=head[s];
	queue< int >Q; Q.push(s);
	while(!Q.empty()){
		int u=Q.front(); Q.pop();
		for(int i=head[u];i;i=e[i].nex){
			int y=e[i].v;
			if(e[i].w>0 && dep[y]==INF){
				Q.push(y);
				now[y]=head[y];
				dep[y]=dep[u]+1;
				if(y==t) return 1;
			}
		}
	}
	return 0;
}
int dfs(int u,ll sum){
	if(u==t) return sum;
	ll k,Flow=0;
	for(int i=now[u]; i>0 && sum>0 ;i=e[i].nex)
	{
		now[u]=i;
		int y=e[i].v;
		if(e[i].w>0 && dep[y]==dep[u]+1){
			k= dfs(y,min(sum,(ll)e[i].w));
			if(k==0) dep[y]=INF;
			e[i].w-=k;
			e[i^1].w+=k;
			Flow+=k;
			sum-=k;
		}
	}
//	printf("%d\n",Flow);
	return Flow;
}
int main(){
	scanf("%d%d%d",&n,&m,&k);
	s=0,t=M-2;
	for(int i=1;i<=n+2;i++){
		fa[i]=i;
	}
	for(int i=1;i<=m;i++){
		scanf("%d%d",&p[i],&Num[i]);
		for(int j=0;j<Num[i];j++){
			scanf("%d",&mp[i][j]);
			if(mp[i][j]==0) mp[i][j]=n+1;
			if(mp[i][j]==-1) mp[i][j]=n+2;
			if(j!=0) Merge(mp[i][j-1],mp[i][j]);
		}
	}
	if(find(n+1)!=find(n+2)){
		printf("0");return 0;
	} 
	while(1){
	    add_edge(s,Ans*(n+1),INF);
	    add_edge(Ans*(n+1),s,0);
	    for(int i=1;i<=m;i++){
	    	int x=(Ans-1)%Num[i],y=Ans%Num[i];
	    	if(mp[i][x]==n+1) x=t;
	    	else x=(Ans-1)*(n+1)+mp[i][x];
	    	if(mp[i][y]==n+2) y=t;
	    	else y=Ans*(n+1)+mp[i][y];
	    	add_edge(x,y,p[i]);
	    	add_edge(y,x,0);
		}
		while(bfs()) Mx+=dfs(s,INF);
		if(Mx>=k){
			printf("%lld",Ans); return 0;
		} 
		for(int i=1;i<=n+1;i++){
			add_edge((Ans-1)*(n+1)+i,(Ans)*(n+1)+i,INF);
			add_edge((Ans)*(n+1)+i,(Ans-1)*(n+1)+i,0);
		}
		Ans++;
	}
	return 0;
}
2023/10/27 14:39
加载中...