社区讨论

40pts求调

P4126[AHOI2009] 最小割参与者 5已保存回复 4

讨论操作

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

当前回复
4 条
当前快照
1 份
快照标识符
@mhj8x6yt
此快照首次捕获于
2025/11/03 22:39
4 个月前
此快照最后确认于
2025/11/08 07:49
4 个月前
查看原帖
CPP
#include<bits/stdc++.h>
using namespace std;
const int N=4005,M=1000005,inf=2e9;
int nx[M],to[M],h[N],cte=1,n,lv[N],cu[N],m,s,t,fl[M],dfn[N],lw[N],ti,st[N],tp,scc[N],ct,u[N],v[N],w[N];
queue<int>q;
bool in[N];
void add(int u,int v,int c){
    nx[++cte]=h[u],to[cte]=v,fl[cte]=c,h[u]=cte;
    nx[++cte]=h[v],to[cte]=u,fl[cte]=0,h[v]=cte;
}
bool bfs(){
    q.push(s),memset(lv,-1,sizeof(lv)),lv[s]=0;
    for(int u;!q.empty();){
        u=q.front(),q.pop(),cu[u]=h[u];
        for(int i=h[u],v;i;i=nx[i])if(lv[v=to[i]]==-1&&fl[i]>0)lv[v]=lv[u]+1,q.push(v);
    }
    return ~lv[t];
}
int dfs(int u=s,int F=inf){
    if(!F||u==t)return F;
    int res=F;
    for(int i=cu[u],v,fw;i&&res;i=nx[i])
        if(cu[u]=i,lv[v=to[i]]==lv[u]+1&&fl[i]>0)
            res-=(fw=dfs(v,min(fl[i],res))),fl[i]-=fw,fl[i^1]+=fw;
    return F-res;
}
void tj(int u){
	dfn[u]=lw[u]=++ti,st[++tp]=u,in[u]=1;
	for(int i=h[u],v;i;i=nx[i]){
		if(!fl[i])continue; 
		if(!dfn[v=to[i]])tj(v),lw[u]=min(lw[u],lw[v]);
		else if(in[v])lw[u]=min(lw[u],dfn[v]);
	}
	if(lw[u]==dfn[u]){
		ct++;
		for(int v;;){
			v=st[tp--],scc[v]=ct,in[v]=0;
			if(v==u)break;
		}
	}
}
int main(){
    ios::sync_with_stdio(false),cin.tie(0),cout.tie(0);
	cin>>n>>m>>s>>t;
	for(int i=1;i<=m;i++)cin>>u[i]>>v[i]>>w[i],add(u[i],v[i],w[i]);
	for(;bfs();dfs());
	for(int i=1;i<=n;i++)if(!dfn[i])tj(i);
	for(int i=1;i<=m;i++){
		if(fl[i<<1])cout<<"0 0\n";
		else cout<<(scc[u[i]]!=scc[v[i]])<<" "<<(scc[u[i]]==scc[s]&&scc[v[i]]==scc[t])<<"\n";
	}
    return 0;
}

回复

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

正在加载回复...