90pts TLEon #11 求助,已知为死循环,码风良好,玄关
查看原帖
90pts TLEon #11 求助,已知为死循环,码风良好,玄关
408557
Xuan_qwq楼主2024/12/26 21:39

rt,把测试点 #11 下载下来然后测了,是 dfs 中的死循环(也可能是建图建错了?),但是看不出问题。

#include<bits/stdc++.h>
using namespace std;
const int inf=0x3f3f3f3f;
int n,m,k,S,T,ans;
int fa[55],h[55],s[55][55],r[55],dis[800005];

int head[800005],cnt=1;
struct edge{
	int v,w,nxt;
}E[1000005];
int find(int x) {
	if(fa[x]==x) return x;
	return fa[x]=find(fa[x]);
}
void add(int u,int v,int w) {
	E[++cnt]=(edge){v,w,head[u]};head[u]=cnt;
	E[++cnt]=(edge){u,0,head[v]};head[v]=cnt;
}
int dfs(int u,int fl) {
	if(u==T) return fl;
	int res=0;
	for(int i=head[u];i;i=E[i].nxt){
		int v=E[i].v,w=E[i].w;
		if(!w||dis[v]!=dis[u]+1)continue;
		int kk=dfs(v,min(w,fl));
		E[i].w-=kk,E[i^1].w+=kk;
		res+=kk;fl-=kk;
		if(!fl) break;
	}
	return res;
}
queue<int>q;
bool bfs() {
	for(int i=1;i<=ans*(n+1);i++) dis[i]=0;
	while(q.size())q.pop();
	q.push(S);dis[T]=0;
	while(q.size()) {
		int u=q.front();q.pop();
		if(u==T)return 1;
		for(int i=head[u];i;i=E[i].nxt){
			int v=E[i].v,w=E[i].w;
			if(!w||dis[v])continue;
			dis[v]=dis[u]+1;
			q.push(v);
		}
	}
	return 0;
}
int main(){
	ios::sync_with_stdio(false);
	cin.tie(0);cout.tie(0);
	cin>>n>>m>>k;
	S=0,T=800003;
	for(int i=1;i<=n+2;i++) fa[i]=i;
	for(int i=1;i<=m;i++) {
		cin>>h[i]>>r[i];
		for(int j=0;j<r[i];j++) {
			cin>>s[i][j];
			if(s[i][j]==0) s[i][j]=n+1;
			if(s[i][j]==-1) s[i][j]=n+2;
			if(j){
				int x=find(s[i][j-1]),y=find(s[i][j]);
				if(x!=y) fa[x]=y;
			}
		}
	}
	if(find(n+1)!=find(n+2)) {
		cout<<"0"<<endl;
		return 0;
	}
	int ff=0;
	while(++ans){
		add(S,ans*(n+1),inf);
		for(int i=1;i<=m;i++) {
			int u=(ans-1)%r[i],v=ans%r[i];
			if(s[i][u]==n+2) u=T;
			else u=(ans-1)*(n+1)+s[i][u];
			if(s[i][v]==n+2) v=T;
			else v=ans*(n+1)+s[i][v];
			add(u,v,h[i]);
		}
		while(bfs()) ff+=dfs(S,inf);
		if(ff>=k){
			cout<<ans<<endl;
			return 0;
		}
		for(int i=1;i<=n+1;i++) add((ans-1)*(n+1)+i,ans*(n+1)+i,inf);
	}
	return 0;
}
2024/12/26 21:39
加载中...