萌新求助!!!
查看原帖
萌新求助!!!
369181
bamboo12345楼主2022/2/18 18:22

第一个测试点AC,其他全部TLE

#include<bits/stdc++.h>
#define int long long
using namespace std;
int n,m;
int head[1000005],nxt[1000005],to[1000005],flow[1000005],val[1000005],cnt=1;
int maxflow,mincost,s=0,t;
void add(int x,int y,int f,int w)
{
	to[++cnt]=y;
	flow[cnt]=f;
	val[cnt]=w;
	nxt[cnt]=head[x];
	head[x]=cnt;
}
int dis[50005],f[50005];
bool bfs()
{
	queue<int> q;
	q.push(s);
	memset(dis,0x3f,sizeof(dis));
	dis[s]=0;
	while(!q.empty())
	{
		int tmp=q.front();
		q.pop();
		f[tmp]=0;
		for(int i=head[tmp];i;i=nxt[i])
		{
			if(flow[i]&&dis[to[i]]>dis[tmp]+val[i])
			{
				dis[to[i]]=dis[tmp]+val[i];
				if(!f[to[i]])
				{
					q.push(to[i]);
					f[to[i]]=1;
				}
			}
		}
	}
	return dis[t]!=0x3f3f3f3f3f3f3f3f;
}
int dfs(int now,int flow1)
{
	if(now==t)
	{
		maxflow+=flow1;
		return flow1;
	}
	f[now]=true;
	int use=0;
	for(int i=head[now];i;i=nxt[i])
	{
		if(!f[to[i]]&&flow[i]&&dis[now]+val[i]==dis[to[i]])
		{
			int f=dfs(to[i],min(flow[i],flow1-use));
			flow[i]-=f,flow[i^1]+=f,mincost+=f*val[i],use+=f;
		}
	}
	f[now]=false;
	return use;
}
void dinic()
{
	maxflow=mincost=0;
	while(bfs())
		dfs(s,0x3f3f3f3f3f3f3f3f);
}
int k;
int x[300005],y[300005],f1[300005],w[300005];
signed main()
{
	cin >>n>>m>>k;
	s=1,t=n;
	for(int i=1;i<=m;i++)
		cin >>x[i]>>y[i]>>f1[i]>>w[i],add(x[i],y[i],f1[i],0),add(y[i],x[i],0,0);
	dinic();
	s=0;
	cout <<maxflow<<" ";
	add(s,1,k,0),add(1,s,0,0);
	for(int i=1;i<=m;i++)
		add(x[i],y[i],0x3f3f3f3f,w[i]),add(y[i],x[i],0,-w[i]);
	dinic();
	cout <<mincost<<endl;
	return 0;
} 
2022/2/18 18:22
加载中...