社区讨论
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 条回复,欢迎继续交流。
正在加载回复...