【最大流 模板 Dinic】POJ 1459 Power Network
2019-04-14 08:42发布
生成海报
Problem Description
给你n, np, nc, m。分别代表有n个点,其中np个是发电站,nc个是消费者,剩下n-np-nc个就是中转站。接下来给你m条边,每条边格式(u,v)w。代表u点到v点这条线路最大能够运输w的电。最后给你np个点最大能够输出的电,nc个点最大能够接收的电(格式:(u)w, u这个点能够输出(接收)最大的电,发电站的点是输出,消费者的点是接收)。
思路:
所有发电站看成一个超级源点s,所有消费者看成一个超级汇点t。如何实现,从s向每个源点连一条容量为对应最大流出容量的边,从每个汇点向t连一条容量为对应最大流入容量的边。然后求s->t的最大流即可。
给了两种形式的Dinic。存图都用了邻接矩阵,这样可以好观察出两种Dinic的那些细节不一样 时间复杂度O(|E||V|^2)
#include
#include
#include
#include
using namespace std;
const int mm = 200;
const int inf = 0x3f3f3f3f;
int Map[mm][mm], n;
int dis[mm];
void bfs(int s, int t)
{
memset(dis, -1, sizeof(dis));
dis[s] = 0;
queue<int> q;
q.push(s);
while(!q.empty())
{
s = q.front(); q.pop();
for(int i = 1; i <= t; i++)
{
if(dis[i] == -1 && Map[s][i])
{
dis[i] = dis[s] + 1;
q.push(i);
}
}
}
}
int dfs(int s, int t, int f)
{
if(s == t) return f;
int ans = 0;
for(int i = 1; i <= t; i++)
{
if(Map[s][i] && dis[i] > dis[s])
{
int d = dfs(i, t, min(f, Map[s][i]));
if(d > 0)
{
Map[s][i] -= d;
Map[i][s] += d;
ans += d;
f -= d;
if(!f) break;
}
}
}
if(ans) return ans;
dis[s] = -1;
return 0;
}
int Dinic(int s, int t)
{
int Max_flow = 0, flow;
for(;;){
bfs(s, t);
if(dis[t] < 0) break;
Max_flow += dfs(s, t, inf);
}
return Max_flow;
}
int main()
{
int np, nc, m, u, v, w, i;
char s[20];
while(~scanf("%d %d %d %d", &n, &np, &nc, &m))
{
memset(Map, 0, sizeof(Map));
while(m--)
{
scanf("%s", s);
sscanf(s, "%*c%d%*c%d%*c%d", &u, &v, &w);
Map[u + 1][v + 1] = w;
}
for(i = 0; i < np; i++)
{
scanf("%s", s);
sscanf(s, "%*c%d%*c%d", &u, &w);
Map[0][u + 1] = w;
}
n = n + 1;
for(i = 0; i < nc; i++)
{
scanf("%s", s);
sscanf(s, "%*c%d%*c%d", &u, &w);
Map[u + 1][n] = w;
}
printf("%d
", Dinic(0, n));
}
return 0;
}
第二种类型主要就标识一下,那些地方不一样。就不那么详细的注释了
#include
#include
#include
#include
using namespace std;
const int mm = 200;
const int inf = 0x3f3f3f3f;
int Map[mm][mm], n;
int dis[mm], iter[mm];
void bfs(int s, int t)
{
memset(dis, -1, sizeof(dis));
dis[s] = 0;
queue<int> q;
q.push(s);
while(!q.empty())
{
s = q.front(); q.pop();
for(int i = 1; i <= t; i++)
{
if(dis[i] == -1 && Map[s][i])
{
dis[i] = dis[s] + 1;
q.push(i);
}
}
}
}
int dfs(int s, int t, int f)
{
if(s == t) return f;
for(int &i = iter[s]; i <= t; i++)
{
if(i == 0) continue;
if(Map[s][i] && dis[i] > dis[s])
{
int d = dfs(i, t, min(f, Map[s][i]));
if(d > 0)
{
Map[s][i] -= d;
Map[i][s] += d;
return d;
}
}
}
return 0;
}
int Dinic(int s, int t)
{
int Max_flow = 0, flow;
for(;;){
bfs(s, t);
if(dis[t] < 0) break;
memset(iter, 0, sizeof(iter));
while((flow = dfs(s, t, inf)) > 0)
{
Max_flow += flow;
}
}
return Max_flow;
}
int main()
{
int np, nc, m, u, v, w, i;
char s[20];
while(~scanf("%d %d %d %d", &n, &np, &nc, &m))
{
memset(Map, 0, sizeof(Map));
while(m--)
{
scanf("%s", s);
sscanf(s, "%*c%d%*c%d%*c%d", &u, &v, &w);
Map[u + 1][v + 1] = w;
}
for(i = 0; i < np; i++)
{
scanf("%s", s);
sscanf(s, "%*c%d%*c%d", &u, &w);
Map[0][u + 1] = w;
}
n = n + 1;
for(i = 0; i < nc; i++)
{
scanf("%s", s);
sscanf(s, "%*c%d%*c%d", &u, &w);
Map[u + 1][n] = w;
}
printf("%d
", Dinic(0, n));
}
return 0;
}
打开微信“扫一扫”,打开网页后点击屏幕右上角分享按钮