POJ 1459 Power Network
2017-07-21 16:27
344 查看
(记录这题纯粹是因为输入格式很有趣 0.0)
题意:输入分别为m个点,a个发电站,b个用户,n条边;接下去是n条边的信息(u,v)cost,cost表示边(u,v)的最大流量;a个发电站的信息(u)cost,cost表示发电站u能提供的最大流量;b个用户的信息(v)cost,cost表示每个用户v能接受的最大流量。
思路:应为发电站有输出限制,用户也有接受限制,所以可以建立一个超级源点和一个超级汇点,然后从超级源点连一条边容量为该发电站的输出限制的边,从用户连一条到超级汇点容量为该用户的接受限制的边,跑一遍网络流模板即可
PS:注意输入的格式!!!
题意:输入分别为m个点,a个发电站,b个用户,n条边;接下去是n条边的信息(u,v)cost,cost表示边(u,v)的最大流量;a个发电站的信息(u)cost,cost表示发电站u能提供的最大流量;b个用户的信息(v)cost,cost表示每个用户v能接受的最大流量。
思路:应为发电站有输出限制,用户也有接受限制,所以可以建立一个超级源点和一个超级汇点,然后从超级源点连一条边容量为该发电站的输出限制的边,从用户连一条到超级汇点容量为该用户的接受限制的边,跑一遍网络流模板即可
PS:注意输入的格式!!!
#include <map> #include <set> #include <cmath> #include <ctime> #include <stack> #include <queue> #include <cstdio> #include <memory> #include <cctype> #include <bitset> #include <string> #include <vector> #include <climits> #include <cstring> #include <iostream> #include <iomanip> #include <algorithm> #include <functional> //#define FIN freopen("input.txt","r",stdin); //#define FOUT freopen("output.txt","w+",stdout); using namespace std; typedef long long ll; const int INF = 0x3f3f3f3f; const int mod = 1e9 + 7; const double eps=1e-8; const double Pi=acos(-1.0); //const int MAXN=55; const int N=110; struct edge { int to,cap,rev;//终点,容量,反向边 }; vector<edge>G[N*N];//图的邻接矩阵表示 bool used[N*N];//dfs中用到的访问标记 int level[N*N];//顶点到源点的距离标号 int iter[N*N];//当前弧,在其之前的边已经没用了 //向图中增加一条从s到t容量为cap的边 void addedge(int u,int v,int w) { G[u].push_back((edge){v,w,G[v].size()}); G[v].push_back((edge){u,0,G[u].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 v=que.front(); que.pop(); for(int i=0;i<G[v].size();i++) { edge &e=G[v][i]; if(e.cap>0&&level[e.to]<0) { level[e.to]=level[v]+1; que.push(e.to); } } } } int dfs(int v,int t,int f) { if(v==t) return f; for(int &i=iter[v];i<G[v].size();i++) { edge &e=G[v][i]; if(e.cap>0& 4000 &level[v]<level[e.to]) { int d=dfs(e.to,t,min(f,e.cap)); if(d>0) { e.cap-=d; G[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; } } void Init() { for(int i=0;i<N;i++) G[i].clear(); } int main() { int V,Power,User,E; while(~scanf("%d %d %d %d",&V,&Power,&User,&E)) { //printf("%d %d %d %d\n",V,Power,User,E); Init(); int a,b,c; for(int i=0;i<E;i++) { while(getchar()!='('); scanf("%d,%d)%d",&a,&b,&c); //printf("%d %d %d\n",a,b,c); addedge(a+1,b+1,c); } for(int i=0;i<Power;i++) { while(getchar()!='('); scanf("%d)%d",&b,&c); //printf("%d %d\n",b,c); addedge(0,b+1,c); } for(int i=0;i<User;i++) { while(getchar()!='('); scanf("%d)%d",&a,&c); //printf("%d %d\n",a,c); addedge(a+1,V+1,c); } printf("%d\n",max_flow(0,V+1)); } return 0; }
相关文章推荐
- POJ1459 - Power Network
- poj 1459--Power Network
- poj1459 Power Network
- Poj 1459 Power Network
- poj 1459 Power Network
- POJ 1459 Power Network
- poj 1459 Power Network 最大网络流 先要构建
- poj 1459 && zoj 1734 Power Network
- (最大流) poj 1459 Power Network
- poj1459 Power Network
- zoj 1734 || poj 1459 Power Network
- Power Network (poj 1459 网络流)
- Poj 1459 Power Network
- POJ 1459.Power Network
- 【网络流】 POJ 1459 Power Network
- POJ 1459 Power Network
- POJ 1459 Power Network
- Power Network - poj 1459 (最大流 Edmonds-Karp算法)
- POJ-1459 Power Network
- 【网络流】 POJ 1459 Power Network