社区讨论

数据越小RE越大

P1343地震逃生参与者 2已保存回复 1

讨论操作

快速查看讨论及其快照的属性,并进行相关操作。

当前回复
1 条
当前快照
1 份
快照标识符
@mi86548f
此快照首次捕获于
2025/11/21 09:15
4 个月前
此快照最后确认于
2025/11/21 09:15
4 个月前
查看原帖
为什么第2个点和第10个点RE了??
看到前面有大佬的讨论
也是RE了
好像是最大流没有判0
不过蒟蒻的我还是没有找出锅在哪
求大佬帮忙看看趴qwq
CPP
#include<bits/stdc++.h>
#define maxm 201000
#define inf 0x7fffffff
#define int long long
using namespace std;

inline int read(){
	int x=0,t=1; char ch=getchar();
	while((ch<'0'||ch>'9')&&ch!='-') ch=getchar();
	if(ch=='-') t=-1,ch=getchar();
	while(ch<='9'&&ch>='0') x=x*10+ch-48,ch=getchar();
	return x*t;
}

int n,m,x;
int u,v,w;
struct EDGE{
	int depth;
	int next,to,val;
}edge[maxm<<1];
int head[maxm],cnt;

inline void add(int u,int v,int w){
	edge[++cnt].to=v;
	edge[cnt].val=w;
	edge[cnt].next=head[u];
	head[u]=cnt;
}

inline bool bfs(){
	queue<int> q;
	while(!q.empty()) q.pop();
	for(register int i=1;i<=n;++i) edge[i].depth=0;
	edge[1].depth=1;
	q.push(1);
	while(!q.empty()){
		int u=q.front(); q.pop();
		for(register int i=head[u];i!=-1;i=edge[i].next){
			int v=edge[i].to;
			if(edge[i].val>0&&edge[v].depth==0){
				edge[v].depth=edge[u].depth+1;
				q.push(v);
			}
		}
	}
	if(edge[n].depth>0) return 1;
	else return 0;
}

inline int dinic(int u,int dis){
	if(u==n) return dis;
	for(register int i=head[u];i!=-1;i=edge[i].next){
		int v=edge[i].to;
		if(edge[i].val>0&&edge[v].depth==edge[u].depth+1){
			int minn=dinic(v,min(dis,edge[i].val));
			if(minn>0){
				edge[i].val-=minn;
				edge[i^1].val+=minn;
				return minn;
			}
		}
	}
	return 0;
}

signed main(){
	cnt=-1;
	memset(head,-1,sizeof(head));
	n=read(); m=read(); x=read();
	for(register int i=1;i<=m;++i){
		u=read(); v=read(); w=read();
		add(u,v,w); add(v,u,0);
	}
	int sum=0;
	while(bfs()){
		while(int num=dinic(1,inf)){
			sum+=num;
		}
	}
	printf("%lld ",sum);
	int last=x%sum;
	int go=x/sum;
	if(last) go+=1;
	printf("%lld\n",go);
	return 0;
}

回复

1 条回复,欢迎继续交流。

正在加载回复...