0pts求助!,蒟蒻实在不知道这份网络流何处有问题,求大佬指点
查看原帖
0pts求助!,蒟蒻实在不知道这份网络流何处有问题,求大佬指点
103226
BeautifulWater楼主2022/8/5 16:19
#include <bits/stdc++.h>

#define endl '\n'
#define pb push_back
#define mp make_pair
#define fi first
#define se second
#define int long long 
using namespace std;
typedef long long ll;

typedef pair<int, int> PII;
const ll N = 2E6 + 500, M = 1E7 + 500, INF = 2e18;
int n, m, k;
struct node {
	int u, v;
	ll cap, now;
	int nt;
} ;
struct LIU{
	ll S, T, c;
	ll idx, h[N], cur[N];
	node edge[M];
	void add(ll u, ll v, ll c) {
		edge[idx] = {u, v, c, 0, h[u]};
		h[u] = idx++;
		edge[idx] = {v, u, c, c, h[v]};
		h[v] = idx++;
	}
	ll dis[N];
	
	bool bfs() {
		//		cout<<"bfs"<<endl;
		for (int i = 0; i <= 2*n; i++)
			dis[i] = -1;
		queue<int > q;
		
		q.push(S), dis[S] = 0, cur[S] = h[S];
		while (q.size()) {
			int t = q.front();
			//		cout<<"t: "<<t<<endl;
			q.pop();
			for (int i = h[t]; ~i; i = edge[i].nt) {
				int v = edge[i].v;
				
				if (dis[v] == -1 && edge[i].cap > edge[i].now) {
					dis[v] = dis[t] + 1;
					cur[v] = h[v];
					if (v == T)
						return true;
					
					q.push(v);
				}
			}
		}
		//   cout<<"fail"<<endl;
		return false;
	}
	
	ll find(int u, ll limit) {
		
		if (u == T)
			return limit;
		ll flow = 0;
		
		for (int i = cur[u]; ~i && flow < limit; i = edge[i].nt) {
			cur[u] = i;
			int v = edge[i].v;
			if (dis[v] == dis[u] + 1 && edge[i].cap > edge[i].now) {
				ll t = find(v, min(edge[i].cap - edge[i].now, limit - flow));
				if (!t)
					dis[v] = -1;//此路不通;
				edge[i].now += t, edge[i ^ 1].now -= t, flow += t;
			}
		}
		return flow;
	}
	
	ll dinic() {	
		ll res = 0, flow;
		while (bfs())
			while (flow = find(S, INF))
				res += flow;
		
		return res;
	}
}Flow;
ll g[600][600];
ll from[N],to[N],wei[N];
void floyed(){
	for(int i=1;i<=n;i++){
		for(int j=1;j<=n;j++){
			for(int k=1;k<=n;k++){
				g[j][k] = min(g[j][k],g[j][i]+g[i][k]);
			}
		}
	}
}
signed main() {
	ios::sync_with_stdio(false);
	cin.tie(0); 
	cin>>n>>m;
	//	cout<<n<<m<<endl;
	memset(g,0x3f,sizeof(g));
	for(int i=1;i<=n;i++){
		g[i][i] = 0;
	}
	
	for(int i=1;i<=m;i++){
		ll u,v,c;
		cin>>from[i]>>to[i]>>wei[i];
		u = from[i];
		v = to[i];
		c = wei[i];
		g[u][v] = g[v][u] = min(g[u][v],c);
	}
	Flow.S = 1+n,Flow.T = n;
	memset(Flow.h,-1,sizeof(Flow.h));
	for(int i=1;i<=n;i++){
		ll x;
		cin>>x;
		Flow.add(i,i+n,x);
	}
	floyed();
	for(int i=1;i<=m;i++){
		if(g[1][ from[i] ]+g[ to[i] ][n]+wei[i]==g[1][n]){
			//	cout<<"?"<<endl;
			Flow.add(from[i]+n , to[i] , INF );
			Flow.add(to[i]+n , from[i] , INF );
		}
	}
	cout<<Flow.dinic();
	return 0;
}
2022/8/5 16:19
加载中...