求助
查看原帖
求助
359614
Forever1507楼主2022/6/18 11:32
#include<bits/stdc++.h>
//#define int long long
using namespace std;
const int inf=1e9;
int n,m,k,s,t,head[200005],nxt[200005],edge[200005],to[200005],level[205];
int tot,fa[205],pay[205],num[205],way[55][55];
void add(int u,int v,int w){
	to[++tot]=v;
	edge[tot]=w;
	nxt[tot]=head[u];
	head[u]=tot;
	to[++tot]=u;
	edge[tot]=0;
	nxt[tot]=head[v];
	head[v]=tot;
}
inline bool bfs(){
	memset(level,0,sizeof(level));
	queue<int>q;
	level[s]=1;
	q.push(s);
	while(!q.empty()){
		int cur=q.front();
		q.pop();
		for(int i=head[cur];i;i=nxt[i]){
			if(edge[i]&&!level[to[i]]){
				q.push(to[i]);
				level[to[i]]=level[cur]+1;
				if(to[i]==t)return 1;
			}
		}
	}
	return 0;
}
int Dinic(int x,int flow){
	if(x==t)return flow;
	int rest=flow,increase;
	for(int i=head[x];i&&rest;i=nxt[i]){
		int y=to[i];
		if(edge[i]&&level[y]==level[x]+1){
			increase=Dinic(y,min(rest,edge[i]));
			if(!increase)level[y]=0;
			edge[i]-=increase;
			edge[i^1]+=increase;
			rest-=increase;
		}
	}
	return flow-rest;
}
int find(int x){
	if(fa[x]==x)return x;
	return fa[x]=find(fa[x]);
}
void unionn(int x,int y){
	int a=find(x),b=find(y);
	if(a!=b){
		fa[a]=b;
	}
	return;
}
signed main(){
//	ios::sync_with_stdio(0);
//	cin.tie(0);
//	cout.tie(0);
	cin>>n>>m>>k;
	tot=1;
	t=1000003;
	for(int i=1;i<=n;++i)fa[i]=i;
	for(int i=1;i<=m;++i){
		cin>>pay[i]>>num[i];
		for(int j=0;j<num[i];++j){
			cin>>way[i][j];
			if(way[i][j]==-1)way[i][j]=n+2;
			if(way[i][j]==0)way[i][j]=n+1;
			if(j!=0)unionn(way[i][j-1],way[i][j]);
		}
	//	way[i][num[i]+1]=way[i][1];
	}
	if(find(n+1)!=find(n+2)){
		cout<<0;
		return 0;
	}
	s=0;
	for(int ans=1;;++ans){
		add(s,(ans-1)*(n+1)+n+1,inf);
		//for(int i=1;i<=n+1;++i)add(i,i+(ans-1)*(n+2),inf);
//		if(ans!=1)
		for(int i=1;i<=m;++i){
			int u=(ans-1)%num[i];
			int v=(ans)%num[i];
			if(way[i][u]==n+2)u=t;
         	else u=(ans-1)*(n+1)+way[i][u];
         	if(way[i][v]==n+2)v=t;
         	else v=(ans)*(n+1)+way[i][v];
			add(u,v,pay[i]);
		}
		int maxflow=0;
		while(bfs())maxflow+=Dinic(s,inf);
		if(maxflow>=k){
			cout<<ans;
			return 0;
		}
		for(int i=1;i<=n+1;++i)add((ans-1)*(n+1)+i,ans*(n+1)+i,inf);
	}
	return 0;
}

样例RE,应该不是数组问题,初步判断RE在add函数但不知道为什么

2022/6/18 11:32
加载中...