codeforces #304 E 546E E. Soldier and Traveling(最大流)

原创 2015年07月10日 17:00:12

题目链接:

点击打开链接

题目大意:

给出一个无向图,每个点有一个值,只能给它周围的一个点一些值,然后达到目标的点权

题目分析:

考虑到点之间的值相互交换,想到了网络流,那么对于每个点,先要拆点,一个点代表起始状态,另一个代表目标状态,也就是同一个点拆成的两个点一定是可以链接,而且权值就是a[i],然后对于每条边,将起始点和目标点连接,因为目标点的流量由起始点的流量和与它相连的其他起始点的流量决定,所以可以利用最大流做,如果最后得到的最大流等于目标点的总数,那么就能完成题目要求,否则不能,然后源点要连向起始点提供流量,目标点连向汇点,容量为目标的点权值,那么走的流量记录在起始点和目标点之间,利用汇点判断能否成功,然后利用边的流量来记录,然后直接输出即可

代码如下:

拆完点之后,套模板.........

#include <iostream>
#include <cstring>
#include <cstdio>
#include <algorithm>
#include <queue>
#define N 207
#define INF 0x3f3f3f3f
#define MAX 10000

using namespace std;

int n,m,u,v;
int sum1,sum2;
int a[N];
int b[N];
int s[N][N];
int d[N];

bool bfs ( )
{
    queue<int> q;
    memset ( d , -1 , sizeof ( d ) );
    d[0] = 0;
    q.push (0);
    while ( !q.empty() )
    {
        int v = q.front();
        q.pop();
        for ( int i = 0 ; i <= 2*n+1 ; i++ )
            if ( d[i] == -1 && s[v][i] )
            {
                d[i] = d[v]+1;
                q.push ( i );
            }
    }
    return d[2*n+1] != -1;
}

int dfs ( int v , int cur_flow )
{
    //cout << v << endl;
    int dt = cur_flow;
    if ( v == 2*n+1 ) return cur_flow;
    for ( int i = 0 ; i <= 2*n+1 ; i++ )
    {
        if ( s[v][i] > 0 && d[v]+1 == d[i] )
        {
            int flow = dfs ( i , min ( dt , s[v][i] ) );
            s[v][i] -= flow;
            s[i][v] += flow;
            dt -= flow;
        }
    }
    return cur_flow - dt;
}

void dinic ( )
{
    int cur_flow , ans = 0;
    //int cnt = 1000000;
    while ( bfs() )
    {
        while ( cur_flow = dfs ( 0 , INF ) )
                ans += cur_flow;
    }
    //cout << "OKAY!" << endl;
    if ( ans != sum1 )
    {
        puts("NO");
        return;
    }
    puts("YES");
    for ( int i = 1 ; i <= n ; i++ )
    {
        for ( int j = n+1 ; j <= 2*n ; j++ )
            if ( !s[i][j] )
                printf ( "0 " );
            else 
            printf ( "%d " , INF - s[i][j] );
        puts("");
    }
}

int main ( )
{
    while ( ~scanf ( "%d%d" , &n , &m ))
    {
        sum1 = 0 , sum2 = 0;
        memset ( s , 0 , sizeof ( s ) );
        for ( int i = 1 ; i <= n ; i++ )
        {
            scanf ( "%d" , &a[i] );
            sum1 += a[i];
            s[0][i] = a[i];
            s[i][n+i] = INF;
        }
        for ( int i = 1 ; i <= n ; i++ )
        {
            scanf ( "%d" , &b[i] );
            sum2 += b[i];
            s[n+i][2*n+1] = b[i];
        }
        while ( m-- )
        {
            int u,v;
            scanf ( "%d%d" , &u , &v );
            s[u][v+n] = INF;
            s[v][u+n] = INF;
        }
        if ( sum1 != sum2 )
        {
            puts("NO");
            continue;
        }
        dinic();
    }
}


版权声明:本文为博主原创文章,未经博主允许不得转载。

Codeforces 546E - Soldier and Traveling (最大流)

RT
  • u014247806
  • u014247806
  • 2015年05月24日 20:54
  • 1033

Codeforces 546E Soldier and Traveling (最大流)

E. Soldier and Traveling time limit per test 1 second memory limit per test 256 megabytes inpu...
  • quailty
  • quailty
  • 2015年06月20日 05:35
  • 1316

【codeforces 546E】Soldier and Traveling

time limit per test1 second memory limit per test256 megabytes inputstandard input outputstandard...
  • harlow_cheng
  • harlow_cheng
  • 2016年12月28日 10:34
  • 187

codeforces 546e Soldier and Traveling

这里写链接内容 E. Soldier and Traveling time limit per test 1 second memory limit per test 256 megabyt...
  • elijahqi
  • elijahqi
  • 2017年12月24日 13:46
  • 43

E. Soldier and Traveling (CF 304 div2) 最大流

题意:给一个无向图,每个点有一个权,这是初态,给出目标态,问能否达到目标态,只能向相邻的点传递权。 思路:网络流,s->a[i]->b[i]->t建图。...
  • u014422052
  • u014422052
  • 2015年05月23日 20:35
  • 712

Codeforces 546E Soldier and Traveling 最大流 C#实现

题意 在某个国家有n个城市,他们通过m条无向的道路相连。每个城市有一支军队。第i个城市的军队有ai个士兵。现在士兵开始移动。每个士兵可以呆在原地,或者走到和他所在城市直接相邻的城市 判断移动之后,能不...
  • luke2834
  • luke2834
  • 2016年04月14日 10:52
  • 276

Codeforces Round #304 (Div. 2) E - Soldier and Traveling 最大流 isap

题意:n个点m条边的一张图,每个点有初始状态a个兵,然后每个点能向相邻的点运送兵,问能不能有一种运法能使每个点到达最终状态b。 其实没想清楚如何建图。。但是似乎把每个点拆成两个点,分别连超源超汇,然后...
  • u014204835
  • u014204835
  • 2015年06月01日 21:40
  • 412

Codeforces Round #304 (Div. 2) 546 E - Soldier and Traveling 最大流

题意:有n个城市m条路,每个城市里有A[i]个士兵,士兵可以留在自己的城市或者邻近的城市,最后是人数是否能为B[i] 思路: 入门最大流#include #include #include #in...
  • qq_27925701
  • qq_27925701
  • 2016年02月28日 05:46
  • 202

codeforces 546 E. Soldier and Traveling

E. Soldier and Traveling time limit per test 1 second memory limit per test 256 megabytes inpu...
  • whai362
  • whai362
  • 2015年10月27日 11:01
  • 455

Codeforces Round #304 (Div. 2) A,B,C题解

A. Soldier and Bananas time limit per test 1 second memory limit per test 256 megabytes input ...
  • qq_24489717
  • qq_24489717
  • 2015年05月27日 13:48
  • 999
内容举报
返回顶部
收藏助手
不良信息举报
您举报文章:codeforces #304 E 546E E. Soldier and Traveling(最大流)
举报原因:
原因补充:

(最多只允许输入30个字)