记录编号 37751 评测结果 AAAAAAAAAA
题目名称 栅格网络流 最终得分 100
用户昵称 GravatarMakazeu 是否通过 通过
代码语言 C++ 运行时间 0.137 s
提交时间 2012-04-07 11:06:17 内存使用 0.64 MiB
显示代码纯文本
#include <cstdio>
#include <cstdlib>
#include <queue>
#include <vector>
#include <cstring>
using namespace std;
typedef long long Int;
const int MAXN=11000;
const Int INF=Int(1e12);
vector<int> Map[MAXN];
vector<Int> Val[MAXN];
queue<int> Q;
Int dist[MAXN];
int flag[MAXN];
int T,N,M,Source,Sink;

inline void SPFA()
{
    for(int i=0;i<=Sink;i++) dist[i]=INF;
    dist[Source]=0;
    Q.push(Source);
    flag[Source]=1;
    int u,v;
    Int nxt;
    while(!Q.empty())
    {
        u=Q.front();
        Q.pop();
        flag[u]=0;
        for(unsigned int i=0;i<Map[u].size();i++)
        {
            v=Map[u][i];
            nxt=dist[u]+Val[u][i];
            if(nxt<dist[v])
            {
                dist[v]=nxt;
                if(!flag[v])
                {
                    Q.push(v);
                    flag[v]=1;
                }
            }
        }
    }
    printf("%lld\n",dist[Sink]);
}

void AddEdge(int s,int e,Int f)
{
	Map[s].push_back(e);
	Val[s].push_back(f);
	Map[e].push_back(s);
	Val[e].push_back(f);
}

void init()
{
	scanf("%d\n",&T);
	Int x;
	while(T--)
	{
		scanf("%d %d\n",&N,&M);
		for(int i=0;i<=10010;i++) { Map[i].clear(); Val[i].clear(); }
		Source=0,Sink=(N-1)*(M-1)+1;
		/*以下橫向*/
		for(int i=1;i<=M-1;i++)
		{
			scanf("%lld",&x); 
			AddEdge(Source,i,x);
		}
		for(int i=2;i<=N-1;i++)
		{
			for(int j=1;j<=M-1;j++)
			{
				scanf("%lld",&x);
				AddEdge((i-2)*(M-1)+j,(i-1)*(M-1)+j,x);
			}
		}
		for(int i=1;i<=M-1;i++)
		{
			scanf("%lld",&x);
			AddEdge(Sink,(N-2)*(M-1)+i,x);
		}
		/*以下縱向*/
		for(int i=1;i<=N-1;i++)
		{
			scanf("%lld",&x);
			AddEdge(Sink,(i-1)*(M-1)+1,x);
			for(int j=2;j<=M-1;j++)
			{
				scanf("%lld",&x);
				AddEdge((i-1)*(M-1)+j-1,(i-1)*(M-1)+j,x);
			}
			scanf("%lld",&x);
			AddEdge(Source,i*(M-1),x);
		}
		SPFA();
	}
}

int main()
{
	freopen("flowa.in","r",stdin);
	freopen("flowa.out","w",stdout);
	init();
	return 0;
}