求助
查看原帖
求助
745970
linjunye楼主2023/11/27 18:22

EK+SPFA

#include<bits/stdc++.h>
using namespace std;
const int INF=0x7f7f7f7f;
//链式前向星
struct Edge{
	int v,w,next,val;//val为价格 
}e[100010];
int head[5010],tot=1;
void AddEdge(int u,int v,int w,int val){
	tot++;
	e[tot].v=v;
	e[tot].w=w;
	e[tot].val=val;
	e[tot].next=head[u];
	head[u]=tot;
	return;
}
//map
int n,m,s,t;
int u,v,w,val;
//spfa
int vis[5010],dis[5010];//dis[i]为1至i的最短路 
struct route{
	int u,pre;
}node[5010];
//最大流
bool spfa(){
	queue<int>Q;
	for(int i=0;i<5010;i++)node[i].u=node[i].pre=0;
	for(int i=0;i<5010;i++)vis[i]=0;
	for(int i=0;i<5010;i++)dis[i]=INF;
	Q.push(s);
	vis[s]=1;
	dis[s]=0;
	while(!Q.empty()){
		int p=Q.front();
		Q.pop();
		vis[p]=0;
		for(int i=head[p];i;i=e[i].next){
			int d=e[i].v;
			if(e[i].w&&dis[d]>dis[p]+e[i].val){
				dis[d]=dis[p]+e[i].val;
				node[d].u=p;
				node[d].pre=i;
				if(!vis[d])vis[d]=1,Q.push(d);
			}
		}
	}
	return dis[t]!=INF;
}
int EK(){
	int ansf=0,ansg=0;
	while(spfa()){
		int mn=INF;
		for(int i=t;i!=s;i=node[i].u)mn=min(mn,e[node[i].pre].w);
		for(int i=t;i!=s;i=node[i].u){
			e[node[i].pre].w-=mn;
			e[node[i].pre^1].w+=mn;
		}
		ansf+=mn;
		ansg+=mn*dis[t];
	}
	printf("%d %d",ansf,ansg);
} 
int main(){
	scanf("%d%d%d%d",&n,&m,&s,&t);
	for(int i=1;i<=m;i++){
		scanf("%d%d%d%d",&u,&v,&w,&val);
		AddEdge(u,v,w,val);
		AddEdge(v,u,0,-val);
	}
	EK();
	return 0;
}

全TLE,但是测过数据点,23ms。

2023/11/27 18:22
加载中...