MnZn刚学网络流求助
查看原帖
MnZn刚学网络流求助
108610
Dzhao楼主2021/2/5 19:28
#include<bits/stdc++.h>
using namespace std;
template <typename T> inline void rd(T &x)
{
	x=0;bool f=0;char c=getchar();
	while(!isdigit(c)) {if(c=='-') f=1;c=getchar();}
	while(isdigit(c)) x=(x<<1)+(x<<3)+(c^48),c=getchar();
	if(f) x=-x;
}
#define int long long
typedef long long ll;
const int N=1005,M=2e6+5,inf=0x7fffffff;
struct node{int x,y,z;}e[M];
int n,m,tot=1,ver[M],nxt[M],edge[M],h[N],flow[M],c[N],d[N],Flow;ll dis[N][2],mxflow;bool vis[N];
inline void add(int x,int y,int z,int c) 
{
	ver[++tot]=y,edge[tot]=z,flow[tot]=c,nxt[tot]=h[x],h[x]=tot;
	ver[++tot]=x,edge[tot]=z,flow[tot]=0,nxt[tot]=h[y],h[y]=tot;
}
void dijkstra(int s,int k)
{
	memset(vis,0,sizeof(vis));
	priority_queue<pair<int,int>>q;
	q.push({0,s});dis[s][k]=0;
	while(q.size())
	{
		int u=q.top().second;q.pop();
		if(vis[u]) continue;vis[u]=1;
		for(int i=h[u];i;i=nxt[i])
		{
			int v=ver[i],w=edge[i];
			if(dis[v][k]>dis[u][k]+w) 
			{
				dis[v][k]=dis[u][k]+w;
				q.push({-dis[v][k],v});
			}
		}
	}
}
int s,t;
bool bfs()
{
	memset(d,0,sizeof(d));
	queue<int>q;
	q.push(s);d[s]=1;
	while(q.size())
	{
		int u=q.front();q.pop();
		for(int i=h[u];i;i=nxt[i])
			if(flow[i] && !d[ver[i]] && dis[u][0]+edge[i]+dis[ver[i]][1]==dis[t][0])
			{
				d[ver[i]]=d[u]+1;
				if(ver[i]==t) return 1;
				q.push(ver[i]);
			}
	}
	return 0;
}
int dinic(int u,int fl)
{
	if(u==t) return fl;
	int rest=fl;
	for(int i=h[u];i && rest;i=nxt[i])
		if(flow[i] && d[ver[i]]==d[u]+1 && dis[u][0]+edge[i]+dis[ver[i]][1]==dis[t][0])
		{
			int k=dinic(ver[i],min(rest,flow[i]));
			if(!k) d[ver[i]]=0;
			flow[i]-=k,flow[i^1]+=k,rest-=k;
		}
	return fl-rest;
}

signed main()
{
	memset(dis,0x3f,sizeof(dis));
	rd(n),rd(m);for(int i=1;i<=m;i++) rd(e[i].x),rd(e[i].y),rd(e[i].z);
	for(int i=1;i<=n;i++) rd(c[i]);s=0,t=n+n+1;c[1]=c[n]=inf;
	for(int i=1;i<=n;i++) add(i,i+n,0,c[i]),add(i+n,i,0,c[i]);
	for(int i=1;i<=m;i++) add(e[i].x+n,e[i].y,e[i].z,inf),add(e[i].y+n,e[i].x,e[i].z,inf);
	add(s,1,0,inf);add(n+n,t,0,inf);add(1+n,s,0,inf);add(t,n,0,inf);
	dijkstra(s,0),dijkstra(t,1);
	while(bfs()) while(Flow=dinic(s,inf)) mxflow+=Flow;
	printf("%lld\n",mxflow);
	return 0;
}

只过了一个点,不知道是不是思路错了,望大佬帮忙差错

2021/2/5 19:28
加载中...