F - Power Network - poj 1459(简单最大流)

时间:2021-04-27 05:13:09
题目大意:题目说了一大堆,其实都是废话......让人有些不知所云,其实就是给了一些电厂,和一些消费点,然后里面有一些路线什么的,求出消费点可以最多消费的电量是多少。
输入大意:
F - Power Network - poj 1459(简单最大流)

分析:懂了题意就是一个模板。。。还不用拆点什么的,不过输入的时候不太明白为什么scanf("(%d,%d)%d")这种输入不好使了,只得用字符串直接读的。

下面是AC代码。
#include<stdio.h>
#include<string.h>
#include<queue>
#include<stack>
#include<algorithm>
#include<math.h>
using namespace std; const int MAXN = ;
const int oo = 1e9+; int G[MAXN][MAXN], layer[MAXN]; void In(char s[])
{
    scanf("%s", s);     for(int i=; s[i]; i++)
    {
        if(s[i]==',' || s[i]=='(' || s[i]==')')
            s[i] = ' ';
    }
} bool bfs(int start, int End)
{
    int used[MAXN] = {};
    queue<int> Q;Q.push(start);     memset(layer, , sizeof(layer));
    used[start] = layer[start] = ;     while(Q.size())
    {
        int u = Q.front();Q.pop();         if(u == End)return true;         for(int i=; i<=End; i++)
        {
            if(!used[i] && G[u][i])
            {
                used[i] = true;
                layer[i] = layer[u] + ;
                Q.push(i);
            }
        }
    }     return false;
}
int dfs(int u, int MaxFlow, int End)
{
    if(u == End)return MaxFlow;     int uFlow = ;     for(int i=; i<=End; i++)
    {
        if(G[u][i] && layer[u] == layer[i]-)
        {
            int flow = min(MaxFlow-uFlow, G[u][i]);
            flow = dfs(i, flow, End);
            G[u][i] -= flow;
            G[i][u] += flow;
            uFlow += flow;             if(uFlow == MaxFlow)
                break;
        }
    }     return uFlow;
}
int dinic(int start, int End)
{
    int MaxFlow = ;     while(bfs(start, End) == true)
        MaxFlow += dfs(start, oo, End);     return MaxFlow;
} int main()
{
    int N, NP, NC, M;     while(scanf("%d%d%d%d", &N, &NP, &NC, &M) != EOF)
    {
        int i, u, v, flow, start=N, End=start+;
        char s[];         memset(G, , sizeof(G));         while(M--)
        {///线路
            In(s);
            sscanf(s, "%d%d%d", &u, &v, &flow);             G[u][v] += flow;
        }         for(i=; i<=NP; i++)
        {///输入发电站,与源点相连
            In(s);
            sscanf(s, "%d%d", &u, &flow);
            G[start][u] = flow;
        }
        for(i=; i<=NC; i++)
        {///消费点,与汇点相连
            In(s);
            sscanf(s, "%d%d", &u, &flow);
            G[u][End] = flow;
        }         printf("%d\n", dinic(start, End));
    }     return ; 

}