POJ 1459 power network(网络流 dinic模版)

版权声明:听说这里让写版权声明~~~ https://blog.csdn.net/m0_37691414/article/details/82083316

题意:给几个发电站,给几个消耗站,再给几个转发点。
发电站只发电,消耗站只消耗电,转发点只是转发电,再给各个传送线的传电能力。
问你消耗站能获得的最多电是多少.

#include <cstdio>
#include <cstring>
#include <iostream>
#include <string>
#include <algorithm>
#include <map>
#include <queue>
#include <vector>
using namespace std;
const int N = 1100;
const int INF = 0x3f3f3f3f;

struct Node
{
    int to;//终点
    int cap; //容量
    int rev;  //反向边
};

vector<Node> v[N]; 		//图的邻接表表示
int  level[N];			//顶点到源点的距离标号
int iter[N];			//当前弧,在其之前的边已经没用了

// 向图中增加一条from到to的容量为cap的边
void add_Node(int from,int to,int cap)  //重边情况不影响
{
    v[from].push_back((Node){to,cap,v[to].size()});
    v[to].push_back((Node){from,0,v[from].size()-1});
}

//通过BFS计算从源点出发的距离标号
void bfs(int s){
	memset(level, -1, sizeof(level));
	queue<int> que;
	level[s] = 0;
	que.push(s);
	while(!que.empty()){
		int t = que.front();
		que.pop();
		for(int i = 0; i < v[t].size(); i++){
			Node &e = v[t][i];
			if(e.cap > 0 && level[e.to] < 0){
				level[e.to] = level[t] + 1;
				que.push(e.to);
			}
		}
	}
}

//通过DFS寻找曾广路
int dfs(int s, int t, int f)
{
    if(s==t)
        return f;
    for(int &i= iter[s]; i<v[s].size() ; i++)
    {
        Node &e = v[s][i];
        if(level[s] < level[e.to] && e.cap>0)
        {
            int d=dfs(e.to, t, min(f,e.cap));
            if(d>0)
            {
                e.cap -= d;
                v[e.to][e.rev].cap += d;
                return d;
            }
        }
    }
    return 0;
}

//求解s到t的最大流
int max_flow(int s, int t)
{
    int flow=0;
    for(;;){
    	bfs(s);
    	if(level[t] < 0)	return flow;
        memset(iter,0,sizeof(iter));
        int f;
        while((f = dfs(s, t, INF)) > 0)
        	flow+=f;
    }
}
int main()
{
    int n,m, np, nc;
    while(~scanf("%d%d%d%d",&n,&np,&nc,&m))
    {
        int s = n, t = n + 1;
        memset(v,0,sizeof(v));
        int from, to, cap;
        while(m--){
            scanf(" (%d,%d)%d",&from, &to, &cap);
            add_Node(from, to, cap);
        }
        while(np--){
            scanf(" (%d)%d",&to, &cap);
            add_Node(s, to, cap);
        }
        while(nc--){
            scanf(" (%d)%d",&from, &cap);
            add_Node(from, t, cap);
        }
        printf("%d\n",max_flow(s,t));
    }
}

猜你喜欢

转载自blog.csdn.net/m0_37691414/article/details/82083316