1 条题解

  • 0
    @ 2025-5-22 13:30:17

    解题思路

    这是一个典型的网络流问题,可以通过构建流网络并使用最大流算法来解决。具体步骤如下:

    构建流网络

    • 添加超级源点SS连接到所有发电站,容量为pmax(u)p_{\max}(u)
    • 添加超级汇点TT,所有消费者连接到TT,容量为cmax(u)c_{\max}(u)
    • 保留原始网络的传输线,容量为lmax(u,v)l_{\max}(u,v)

    计算最大流

    • 使用Dinic算法或Edmonds-Karp算法计算从SSTT的最大流
    • 这个最大流值就是网络能支持的最大电力消耗ConCon

    解决代码

    #include <iostream>
    #include <cstring>
    #include <queue>
    #include <limits.h>
    #include <cstdio>
    using namespace std;
     
    #define min(x,y) x < y ? x : y
    const int MAXN = 105;
    int a[MAXN], p[MAXN], cap[MAXN][MAXN], flow[MAXN][MAXN];
    int n, np, nc, m;
     
    int ek(int s, int t)
    {
    	int f = 0;
    	memset(p, 0, sizeof(p));
    	memset(flow, 0, sizeof(flow));
    	queue<int> q;
    	
    	while(true)
    	{
    		memset(a, 0, sizeof(a));
    		q.push(s);
    		a[s] = INT_MAX;
    		while(!q.empty())
    		{
    			int u = q.front(); q.pop();
    			for(int v = 0; v <= n+2; v++)
    			{
    				if(!a[v] && cap[u][v] > flow[u][v])
    				{
    					p[v] = u; q.push(v);
    					a[v] = min(a[u], cap[u][v] - flow[u][v]);
    				}
    			}
    		}
    		if(0 == a[t]) break;
    		for(int u = t; u != s; u = p[u])
    		{
    			flow[p[u]][u] += a[t];
    			flow[u][p[u]] -= a[t];
    		}
    		f += a[t];
    	}
    	
    	return f;
    }
     
    int main()
    {
    	while(~scanf("%d%d%d%d", &n, &np, &nc, &m))
    	{
    		memset(cap, 0, sizeof(cap));
    		for(int i = 0; i < m; i++)
    		{
    			int b, c, d;
    			scanf(" (%d,%d)%d", &b, &c, &d);
    			cap[b+1][c+1] = d;
    		}
    		for(int i = 0; i < np; i++)
    		{
    			int b, c;
    			scanf(" (%d)%d", &b, &c);
    			cap[0][b+1] = c;
    		}
    		for(int i = 0; i < nc; i++)
    		{
    			int b, c;
    			scanf(" (%d)%d", &b, &c);
    			cap[b+1][n+2] = c;
    		}
    		printf("%d\n", ek(0, n+2));
    	}
    	
    	return 0;
    }
    
    • 1

    信息

    ID
    460
    时间
    1000ms
    内存
    256MiB
    难度
    7
    标签
    递交数
    3
    已通过
    1
    上传者