首页 > 代码库 > BNUOJ 52517 Another Server

BNUOJ 52517 Another Server

网络流。

似乎有别的做法,没想。

#include<bits/stdc++.h>using namespace std;const int maxn = 100 + 10;const int INF = 0x7FFFFFFF;struct Edge{    int from, to, cap, flow;    Edge(int u, int v, int c, int f) :from(u), to(v), cap(c), flow(f){}};vector<Edge>edges;vector<int>G[maxn];bool vis[maxn];int d[maxn];int cur[maxn];int n, s, t;void init(){    for (int i = 0; i < maxn; i++)        G[i].clear();    edges.clear();}void AddEdge(int from, int to, int cap){    edges.push_back(Edge(from, to, cap, 0));    edges.push_back(Edge(to, from, 0, 0));    int w = edges.size();    G[from].push_back(w - 2);    G[to].push_back(w - 1);}bool BFS(){    memset(vis, 0, sizeof(vis));    queue<int>Q;    Q.push(s);    d[s] = 0;    vis[s] = 1;    while (!Q.empty())    {        int x = Q.front();        Q.pop();        for (int i = 0; i<G[x].size(); i++)        {            Edge e = edges[G[x][i]];            if (!vis[e.to] && e.cap>e.flow)            {                vis[e.to] = 1;                d[e.to] = d[x] + 1;                Q.push(e.to);            }        }    }    return vis[t];}int DFS(int x, int a){    if (x == t || a == 0)        return a;    int flow = 0, f;    for (int &i = cur[x]; i<G[x].size(); i++)    {        Edge e = edges[G[x][i]];        if (d[x]+1 == d[e.to]&&(f=DFS(e.to,min(a,e.cap-e.flow)))>0)        {            edges[G[x][i]].flow+=f;            edges[G[x][i] ^ 1].flow-=f;            flow+=f;            a-=f;            if(a==0) break;        }    }    if(!flow) d[x] = -1;    return flow;}int dinic(int s, int t){    int flow = 0;    while (BFS())    {        memset(cur, 0, sizeof(cur));        flow += DFS(s, INF);    }    return flow;}int T;int main(){    scanf("%d",&T);    while(T--)    {        scanf("%d",&n);        init();        s=1; t=n;        for(int i=1;i<=2*n-2;i++)        {            int x; scanf("%d",&x);            AddEdge((i+1)/2,(i+1)/2+1,x);        }        printf("%d\n",dinic(s,t));    }    return 0;}

 

BNUOJ 52517 Another Server