题目链接
https://vjudge.net/problem/POJ-1459
题意
n个节点,有用电器,有发电站,有中转站,m条路线,有流量限制,求最大用电器功率
思路
不知道为什么一个最大流模板题题干这么绕人。。按m建图,s向发电站连边,权为发电量,用电器向t连边,权为最大功率,跑最大流
输入部分稍显麻烦,自己用的cin,看别人的博客学的c输入,挺巧妙的。
代码
#include<cstdio>
#include<iostream>
#include<iomanip>
#include<map>
#include<string>
#include<queue>
#include<cstring>
#include<algorithm>
#include<cmath>
#include<cstdlib>
#define IOS ios::sync_with_stdio(false);cin.tie(0);cout.tie(0);
#define endl "\n"
//#define int long long
using namespace std;
typedef long long ll;
const int inf=0x3f3f3f3f;
const int maxn=1010;
const int maxe=50010;
int head[maxn],cnt;
struct Edge{
int v;
int w;
int next;
}edge[maxe];
int n,n1,n2,m,k,s,t;
ll maxflow;
int deep[maxn];//²ã¼¶Êý£¬ÆäʵӦ¸ÃÊÇlevel
int now[maxe];//µ±Ç°»¡ÓÅ»¯
void init(){
memset(head,-1,sizeof(head));//Çå¿ÕËùÓеã¶ÔÓ¦±ßµÄÁªÏµ
cnt=0;
maxflow=0;
return ;
}
void add(int u,int v,int w){
// cout<<u<<" "<<v<<" "<<w<<endl;
edge[cnt].v=v;
edge[cnt].w=w;
edge[cnt].next=head[u];
head[u]=cnt++;
}
inline bool bfs(){//ÔÚ²ÐÁ¿ÍøÂçÖй¹Ôì·Ö²ãͼ
memset(deep,0x3f,sizeof(deep));
queue<int>q;
q.push(s);deep[s] = 0;now[s] = head[s];//һЩ³õʼ»¯
while(q.size()){
int x = q.front();q.pop();
for(int i=head[x];i!=-1;i=edge[i].next){
int y=edge[i].v;
if(edge[i].w>0&&deep[y]==inf){//û×ß¹ýÇÒÊ£ÓàÈÝÁ¿´óÓÚ0
q.push(y);
now[y]=head[y];//Ïȳõʼ»¯£¬ÔÝʱ¶¼Ò»Ñù
deep[y]=deep[x]+1;
if(y==t) return 1;//ÕÒµ½ÁË
}
}
}
return 0;
}
//flowÊÇÕûÌõÔö¹ã·¶Ô×î´óÁ÷µÄ¹±Ï×£¬restÊǵ±Ç°×îСʣÓàÈÝÁ¿£¬ÓÃrestÈ¥¸üÐÂflow
ll dfs(int x,int flow){//ÔÚµ±Ç°·Ö²ãͼÉÏÔö¹ã
if(x==t) return flow;
ll ans = 0,k,i;
for(i=now[x];i!=-1&&flow;i=edge[i].next){
now[x]=i;//µ±Ç°»¡ÓÅ»¯£¨±ÜÃâÖظ´±éÀú´Óx³ö·¢µÄ²»¿ÉÍØÕ¹µÄ±ß£©
int y=edge[i].v;
if(edge[i].w>0&&(deep[y]==deep[x]+1)){//±ØÐëÊÇÏÂÒ»²ã²¢ÇÒÊ£ÓàÈÝÁ¿´óÓÚ0
k=dfs(y,min(flow,edge[i].w));//È¡×îС
if(!k) deep[y]=inf;//¼ôÖ¦£¬È¥µôÔö¹ãÍê±ÏµÄµã
edge[i].w-=k;//»ØËÝʱ¸üÐÂ
edge[i^1].w+=k;//³É¶Ô±ä»»
ans+=k;
flow-=k;
}
}
return ans;
}
void dinic(){
while(bfs())
maxflow+=dfs(s,inf);
}
int main(){
while(scanf("%d%d%d%d",&n,&n1,&n2,&m)==4){
init();
s=n+5,t=s+1;
while(m--){
int u,v,w;
while(getchar()!='(');
scanf("%d%*c%d%*c%d",&u,&v,&w);
add(u,v,w);
add(v,u,0);
}
while(n1--){
int u,w;
while(getchar()!='(');
scanf("%d%*c%d",&u,&w);
add(s,u,w);
add(u,s,0);
}
while(n2--){
int u,w;
while(getchar()!='(');
scanf("%d%*c%d",&u,&w);
add(u,t,w);
add(t,u,0);
}
dinic();
printf("%d\n",maxflow);
}
return 0;
}