題意:
簡單的說下題意(按輸入輸出來講,前面的描述一堆的rubbish,還用來誤導人),給你n個點,其中有np個是能提供電力的點,nc個是能消費電力的點,剩下的點(n-np-nc)是中轉戰即不提供電力也不消費電力,點與點之間是有線路存在的,有m條線路,每條線路有最多運載限定。
前4個資料就是有n個點,np個供電點,nc個消費點,m條線路,接來題目先給出的是m條線路的資料,(起點,終點)最多運載量,然後是np個供電點的資料(供電點)最多供電量,接著就是nc個消費點的資料(消費點)最多消費電量。
題目要我們求出給定的圖最大能消費的總電量(就是求最大流)
分析:增加乙個超級源點,和超級匯點。。把所給的發電站都和超級源點相連,把所給的消耗戰都和超級匯點相連
然後需要注意的地方就是輸入的地方有點坑,大家注意一下輸入的地方就可以了
下面的是我用isap做的,正好剛入門網路流,也正好學到isap,小試一下qaq
#include#include#include#include#include#include#includeusing namespace std;
const int max_nodes=4e4;
const int inf=0x3f3f3f3f;
#define rep(i,a,b) for(int i=a;i<=b;i++)
#define me(a,b) memset(a,b,sizeof a)
typedef long long ll;
struct node
;vectorg[max_nodes];
vectoredges;
vector::iterator it;
int num_nodes;
int source; // 源點
int sink; // 匯點
int p[max_nodes]; // 可增廣路上的上一條弧的編號
int num[max_nodes]; // 和 t 的最短距離等於 i 的節點數量
int cur[max_nodes]; // 當前弧下標
int d[max_nodes]; // 殘量網路中節點 i 到匯點 t 的最短距離
bool vis[max_nodes];
typedef vector::iterator iterator_t ;
void add(int u,int v,int w));
edges.push_back((node));
int k=edges.size();
g[u].push_back(k-2);
g[v].push_back(k-1);
}void bfs()}}
}int augment()
u=sink;
while(u!=source)
return df;
}int max_flow()
}if(!flag)
if(--num[d[u]]==0) break;
num[d[u]=m+1]++;
cur[u]=0;
if(u!=source)
u=edges[p[u]].from;}}
return ans;
}int main()
while(np--)
while(nc--)
sink=n+1;
num_nodes=n+2;
source=0;
printf("%d\n",max_flow());
for(int i=0;i<=num_nodes;i++)
g[i].clear();
edges.clear();
}return 0;
}
emmmmm,這個當做模板也是可以的 poj1459 多源點網路流
題意 有n個點,np個供電點,nc個消費點,m條線路,接來題目先給出的是m條帶權路徑,然後是np個供電點和權值,接著就是nc個消費點和權值。題目要我們求出給定的圖最大能消費的總電量 就是求最大流 思路 建乙個超級源點,乙個超級匯點。超級源點連線所以供電站,所以消費點連線超級匯點。跑一遍網路流即可。i...
POJ1459 多源點多匯點的網路流
多源點多匯點的網路流其實處理方法很簡單.給所有源點加乙個超級源點.給所有匯點加乙個超級匯點.然後赤果果的最大流.poj1459 多源點多匯點最大流.dinic模板題.includeusing namespace std const int oo 2000000000 int n,np,nc,m,ne...
poj1459多源點多匯點最大流
題意 有許多發電廠,需求電的地方 就說耗電場吧 和一些中轉站,要求出各個耗電場耗電之和,並使之最大。其中邊上的權值為能流通的最大電量。題目解析 這道題目也是很簡單的最大流題目,只需要新增乙個總的源點和乙個總的匯點,然後從總源點到子源點邊上的權值為子源點的發電量,從匯點到總匯點邊上的權值為子匯點的需求...