版权声明:听说这里让写版权声明~~~ 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));
}
}