记录编号 360879 评测结果 AAAAAAAAAA
题目名称 运输问题4 最终得分 100
用户昵称 GravatarAntiLeaf 是否通过 通过
代码语言 C++ 运行时间 0.007 s
提交时间 2017-01-02 06:34:17 内存使用 0.68 MiB
显示代码纯文本
#include<cstdio>
#include<cstring>
#include<algorithm>
#include<queue>
using namespace std;
const int maxn=110,maxe=maxn*maxn;
struct edge{int to,cap,cost,prev;}e[maxe<<1];
void addedge(int,int,int,int);
void AddEdge(int,int,int,int);
int MCMF();
void SPFA();
int last[maxn],len=0,dis[maxn],p[maxn];
bool inq[maxn];
int n,cap,cost,s,t;
int main(){
	freopen("maxflowd.in","r",stdin);
	freopen("maxflowd.out","w",stdout);
	memset(last,-1,sizeof(last));
	scanf("%d%d%d",&n,&s,&t);
	for(int i=1;i<=n;i++)for(int j=1;j<=n;j++){
		scanf("%d%d",&cap,&cost);
		if(cap)addedge(i,j,cap,cost);
	}
	printf("%d",MCMF());
	return 0;
}
void addedge(int x,int y,int z,int w){
	AddEdge(x,y,z,w);
	AddEdge(y,x,0,-w);
}
void AddEdge(int x,int y,int z,int w){
	e[len].to=y;
	e[len].cap=z;
	e[len].cost=w;
	e[len].prev=last[x];
	last[x]=len++;
}
int MCMF(){
	int cost=0;
	while(SPFA(),dis[t]<0x3f3f3f3f){
		int x,delta=(~0u)>>1;
		for(x=t;x!=s;x=e[p[x]^1].to)delta=min(delta,e[p[x]].cap);
		cost+=dis[t]*delta;
		for(x=t;x!=s;x=e[p[x]^1].to){
			e[p[x]].cap-=delta;
			e[p[x]^1].cap+=delta;
		}
	}
	return cost;
}
void SPFA(){
	queue<int>q;
	memset(dis,63,sizeof(dis));
	memset(inq,0,sizeof(inq));
	q.push(s);
	dis[s]=0;
	while(!q.empty()){
		int x=q.front();
		q.pop();
		inq[x]=false;
		for(int i=last[x];i!=-1;i=e[i].prev)if(e[i].cap>0&&dis[e[i].to]>dis[x]+e[i].cost){
			dis[e[i].to]=dis[x]+e[i].cost;
			p[e[i].to]=i;
			if(!inq[e[i].to]){
				inq[e[i].to]=true;
				q.push(e[i].to);
			}
		}
	}
}