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 Round #304 (Div. 2) 546 E - Soldier and Traveling 最大流

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

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

RT

Codeforces 546E Soldier and Traveling (最大流+输出流量分配方案)

n个顶点m条边的无向图,每个点有ai名士兵,每名士兵只能留在原地或移动到相邻点,给出移动后每个顶点的士兵数 bi,问是否存在移动方案,并输出如何移动。...
  • Just_Lm
  • Just_Lm
  • 2017年01月22日 17:12
  • 120

Codeforces 546 E Soldier and Traveling【最大流Dinic+判断残余网络】

E. Soldier and Traveling time limit per test 1 second memory limit per test 256 megabytes input...

CodeForces 546E - Soldier and Traveling(最大流+输出边流量)

题目链接:click here~~ 【题目大意】:给定一些城市里面原先状态的士兵数目,和某些城市之间的联通关系,求能否达到最终状态。 【解题思路】做完这套题,感觉这道题是五个题里最有质量的题了,首先比...

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

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

E. Soldier and Traveling(CF546E) Codeforces Round #304 (Div. 2)

E. Soldier and Traveling time limit per test 1 second memory limit per test 256 megabyte...

Codeforces 546E - Soldier and Traveling (网络流输出流量)

建图: i点拆成ai,bi两个点。源点到ai连a[i]的流量,ai到bi连INF(表示不动的士兵)bi到汇点连b[i]的流量。对于x到y的每条边连ax到by,ay到bx,流量为INF的边(士兵移动)...

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

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

Codeforces Round #304 (Div. 2)E. Soldier and Traveling 网络流

http://www.51nod.com/onlineJudge/questionCode.html#!problemId=1442题意:n个城市,m条边, 每个点刚开始有ai个人,问最后能不能有bi...
  • yp_2013
  • yp_2013
  • 2016年02月24日 21:12
  • 165
内容举报
返回顶部
收藏助手
不良信息举报
您举报文章:codeforces #304 E 546E E. Soldier and Traveling(最大流)
举报原因:
原因补充:

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