首页 > 代码库 > 【2014 Multi-University Training Contest 3 1002】/【HDU 4888】 Redraw Beautiful Drawings

【2014 Multi-University Training Contest 3 1002】/【HDU 4888】 Redraw Beautiful Drawings

不容易啊,终于可以补第二个题了!!

顺便说一句:模版写残了就不要怪出题人啊 ~ (这残废模版研究了好长时间才找出错)


题目大意:

有一个n*m的矩阵,每一个格子里都将有一个数。给你每一行数字之和和每一列数字之和。求每一个位置能填0~k之间的哪个数。如果有多种可能输出“Not Unique”,如果没有解输出“Impossible”,如果一组解则将其输出。


解题思路:

最大流: 不可能的条件:是行之和和列之和不想等或者建图后的最大流与他们不想等。

多组的条件是:在最大流后的残流网络中有长度大于2的环(实际中最少大于3)。


下面是代码:

#include <stdio.h>
#include <string.h>
#include <iostream>
#include <algorithm>
#include <vector>
#include <queue>
#include <set>
#include <map>
#include <string>
#include <math.h>
#include <stdlib.h>

#define eps 1e-9
#define pi acos(-1.0)
#define inf 107374182  
#define inf64 1152921504606846976  
#define clear1(A, X, SIZE) memset(A, X, sizeof(A[0]) * (SIZE))
#define clearall(A, X) memset(A, X, sizeof(A))
#define memcopy1(A , X, SIZE) memcpy(A , X ,sizeof(X[0])*(SIZE))
#define memcopy1all(A, X) memcpy(A , X ,sizeof(X))
#define max( x, y )  ( ((x) > (y)) ? (x) : (y) )
#define min( x, y )  ( ((x) < (y)) ? (x) : (y) )

using namespace std;

const int maxn=1000+10;
const int maxm=200000+10;

struct node
{
    int v,w,next;
    node(int v=0,int w=0,int next=0):v(v),w(w),next(next) {};
} edge[maxm<<1];
int head[maxn],d[maxn],nEdge,S,T;
bool vis[maxn];
int n,m,K;
void addedge(int from,int to,int cap)
{
    edge[++nEdge]=node(to,cap,head[from]);
    head[from]=nEdge;
    edge[++nEdge]=node(from,0,head[to]);
    head[to]=nEdge;
}
int deep[maxn];
bool bfs()
{
    memset(deep,-1,sizeof(deep));
    queue<int>q;
    q.push(S);//源点
    deep[S]=0;
    while(!q.empty())
    {
        int u=q.front();
        q.pop();
        int p=head[u];
        while(p!=-1)
        {
            int v=edge[p].v;
            if(deep[v]==-1&&edge[p].w>0)
            {
                q.push(v);
                deep[v]=deep[u]+1;
            }
            p=edge[p].next;
        }
    }
    return deep[T]!=-1; //汇点

}
int DFS(int src ,int flow)
{
    if(src=http://www.mamicode.com/=T||flow==0)return flow;>