阳历死活不对,求调教
查看原帖
阳历死活不对,求调教
656447
__Ship_楼主2025/5/16 17:08
#include<bits/stdc++.h>
using namespace std;
//dis[i]表示当前离源点有多少层
long long v[205][205],ans,dis[205],n,m,s,t,cnt;
long long bfs(){//分层图 
	memset(dis,0,sizeof(dis));
	queue<long long> q;
	q.push(s);
	dis[s]=1;
	while(!q.empty()){
		long long f=q.front();
		q.pop();
		for(int i = 1 ; i <= n ; i++){
			if(v[f][i]){//当前路径的流量未被用完 
				if(!dis[i]){
					q.push(i);
					dis[i]=dis[f]+1;
				}
			}
		}
	}
	return dis[t];//能否到达汇点 
}
long long dfs(long long now,long long sums){//sum是整条增广路对最大流的贡献
	if(now==t){
		return sums;//这是一条增广路,贡献其流量 
	}
	long long ret=0;
	for(int i = 1 ; i <= n ; i++){
		if(dis[i]==dis[now]+1&&v[now][i]){//对于dis[i]==dis[now]+1的理解:只要有其他的点可以连接到他且层数更少(一定)就跳出 
			long long tmp=dfs(i,min(v[now][i],sums-ret));//剩下的流量比这条边还小,跑剩下的流量(最开始给的是longlongmax) 
			v[now][i]-=tmp;//给予其反悔的机会 
			v[i][now]+=tmp;
			ret+=tmp;//加上贡献 
		}
	}
	return ret;
}
void dfn(int x,int f){
    bool fg=0;
    for(int i = 1 ; i <= n ; i++){
		if(f!=v[x][i]){
			fg=1;
            dfn(v[x][i],x);
            v[i][x]=0;
		}
	}
    if(!fg){
        v[x][t]=LONG_LONG_MAX;
       	v[t][x]=0;
    }
}
int main(){
	cin>>n>>s;
	t=n+1;
	n-=1;
	while(n--){
		long long x,y,z;
		cin>>x>>y>>z;
		v[x][y]+=z;
		v[y][x]+=z;
	}
	dfn(s,-1);
	while(bfs()){
		ans+=dfs(s,LONG_LONG_MAX);
	}
	cout<<ans; 
	return 0;
}
2025/5/16 17:08
加载中...