记录编号 60569 评测结果 AAAAAAAAAA
题目名称 栅格网络流 最终得分 100
用户昵称 GravatarSpaceQ 是否通过 通过
代码语言 C++ 运行时间 0.237 s
提交时间 2013-05-26 18:56:44 内存使用 20.34 MiB
显示代码纯文本
#include<cstdio>
#include<cstring>
using namespace std;
#include<vector>
#include<iostream>
//#include<WJMZBMR>
#include<queue>
#define rep(i,n) for(int i=0;i<n;i++)
#define pb push_back
#define maxn 1000000

int s,t,n,m;
inline int idu(int i,int j)
{
	if(i==0)return s;
	return (i-1)*(m-1)+j;
}
inline int idd(int i,int j)
{
	if(i==n-1)return t;
	return i*(m-1)+j;
}
inline int idr(int i,int j)
{
	if(j==m-1)return s;
	return i*(m-1)+j;
}
inline int idl(int i,int j)
{
	if(j==0)return t;
	return i*(m-1)+j-1;
}
struct edge
{
	int to,c;
};
vector<edge>G[maxn];
void add(int from,int to,int c)
{
	G[from].pb((edge){to,c});
	G[to].pb((edge){from,c});
}
long long d[maxn];
bool v[maxn];
struct state
{
	int p;
	bool operator<(const state&o)const
	{
		return d[p]>d[o.p];
	}
};

priority_queue<state>Q;
void dij()
{
	memset(d,127,sizeof(d));
	memset(v,0,sizeof(v));

	d[s]=0;
	Q.push((state){s});

	while(Q.size())
	{
		int x=Q.top().p;Q.pop();
		if(v[x])continue;
		v[x]=true;
		rep(i,G[x].size())
		{
			edge&e=G[x][i];
			if(d[e.to]>d[x]+e.c)
			{
				d[e.to]=d[x]+e.c;
				Q.push((state){e.to});
			}
		}
	}
}
	
int main()
{
	freopen("flowa.in","r",stdin);
	freopen("flowa.out","w",stdout);
	int T,a;
	scanf("%d",&T);
	while(T--)
	{
		scanf("%d%d",&n,&m);
		s=(n-1)*(m-1);t=s+1;
		rep(i,n*m+3)G[i].clear();
		rep(i,n)rep(j,m-1)
		{
			scanf("%d",&a);
			add(idu(i,j),idd(i,j),a);
		}
		rep(i,n-1)rep(j,m)
		{
			scanf("%d",&a);
			add(idr(i,j),idl(i,j),a);
		}
		dij();
		long long ans=d[t];
		cout<<ans<<endl;
	}
	return 0;
}