A group of thieves is approaching a museum in the country of zjsxzy,now they are in city A,and the museum is in city B,where keeps many broken legs of zjsxzy.Luckily,GW learned the conspiracy when he is watching stars and told it to zjsxzy. 

Zjsxzy decided to caught these thieves,and he let the police to do this,the police try to catch them on their way from A to B. Although the thieves might travel this way by more than one group, zjsxzy's excellent police has already gather the statistics that the cost needed on each road to guard it. 

Now ,zjsxzy's conutry can be described as a N*N matrix A,Aij indicates the city(i,j) have bidirectionals road to city(i+1,j) and city(i,j+1),gurad anyone of them costs Aij. 

Now give you the map,help zjsxzy to calculate the minimium cost.We assume thieves may travel in any way,and we will catch all passing thieves on a road if we guard it.

Input

The first line is an integer T,followed by T test cases. 

In each test case,the first line contains a number N(1<N<=400). 

The following N lines,each line is N numbers,the jth number of the ith line is Aij. 

The city A is always located on (1,1) and the city B is always located on (n,n). 

Of course,the city (i,j) at the last row or last line won't have road to (i,j+1) or (i+1,j).

Output

For each case,print a line with a number indicating the minimium cost to arrest all thieves.

Sample Input

1
3
10 5 5
6 6 20
4 7 9

Sample Output

18

        

Hint

The map is like this:

  

题解:我们根据欧拉函数可以将其转化为偶图,然后加起点和终点,转化为求最短路问题;

AC代码为:

//最小割转化为最短路问题(偶图为稀疏图,故用FIFO队列的SPFA在O(nlogn)时间内稳定) 

#include<bits/stdc++.h>

using namespace std;

const int INF=0x3f3f3f3f;

const int maxn=170000;

 

struct point

{

    int v,w;

}Point;

 

vector<point> e[maxn];

int n,S,T,q[maxn];

int dis[maxn];

bool inq[maxn];

int SPFA()

{

    int i,k,head=0,tail=0;

    memset(inq,false,sizeof inq);

    for(i=0;i<=(n-1)*(n-1)+1;i++) dis[i]=INF;

    q[tail++]=S;

    dis[S]=0;

    inq[S]=true;

    while(head!=tail)

    {

        k=q[head];

        head=(head+1)%maxn;

        inq[k]=false;

        for(i=0;i<e[k].size();i++)

        {

            Point=e[k][i];

            if(dis[Point.v]>dis[k]+Point.w)

            {

                dis[Point.v]=dis[k]+Point.w;

                if(!inq[Point.v])

                {

                    inq[Point.v]=true;

                    q[tail]=Point.v;

                    tail=(tail+1)%maxn;

                }

            }

        }

    }

    return dis[T];

}

 

int main()

{

    int t,i,j,k;

    scanf("%d",&t);

    while(t--)

    {

        scanf("%d",&n);

        for(i=0;i<(n-1)*(n-1)+2;i++) e[i].clear();

        S=(n-1)*(n-1);

        T=(n-1)*(n-1)+1;

        for(i=0;i<n;i++)

        {

            for(j=0;j<n;j++)

            {

                scanf("%d",&k);

                Point.w=k;

                if(i==0&&j!=n-1)

                {

                    Point.v=j;

                    e[S].push_back(Point);

                }

                if(j==n-1&&i!=n-1)

                {

                    Point.v=i*(n-1)+j-1;

                    e[S].push_back(Point);

                }

                if(j==0&&i!=n-1)

                {

                    Point.v=T;

                    e[i*(n-1)].push_back(Point);

                }

                if(i==n-1&&j!=n-1)

                {

                    Point.v=T;

                    e[(n-2)*(n-1)+j].push_back(Point);

                }

 

                if(i!=n-1&&j!=n-1)

                {

                    if(i)

                    {

                        Point.v=(i-1)*(n-1)+j;

                        e[i*(n-1)+j].push_back(Point);

                        Point.v=i*(n-1)+j;

                        e[(i-1)*(n-1)+j].push_back(Point);

                    }

                    if(j)

                    {

                        Point.v=i*(n-1)+j-1;

                        e[i*(n-1)+j].push_back(Point);

                        Point.v=i*(n-1)+j;

                        e[i*(n-1)+j-1].push_back(Point);

                    }

                }

            }

        }

        printf("%d\n",SPFA());

    }

    return 0;

}

HDU3870-Caught these thieves(最小割-&gt;偶图-&gt;最短路问题)的更多相关文章

  1. bzoj 1001 狼抓兔子 —— 平面图最小割(最短路)

    题目:https://www.lydsy.com/JudgeOnline/problem.php?id=1001 平面图最小割可以转化成最短路问题: 建图时看清楚题目的 input ... 代码如下: ...

  2. URAL1277 Cops and Thieves(最小割)

    Cops and Thieves Description: The Galaxy Police (Galaxpol) found out that a notorious gang of thieve ...

  3. HDU3870 Catch the Theves(平面图最小割转最短路)

    题目大概说给一个n×n的方格,边有权值,问从求(1,1)到(n,n)的最小割. 点达到了160000个,直接最大流不好.这题的图是平面图,求最小割可以转化成求其对偶图的最短路,来更高效地求解: 首先源 ...

  4. HDU3491 Thieves(最小割)

    题目大概说,一个国家有n个城市,由m条双向路相连,小偷们从城市s出发准备到h城市,警察准备在某些除了s和h外的城市布置警力抓小偷,各个城市各有警力所需的数目.问警察最少要布置多少警力才能万无一失地抓住 ...

  5. hdu3870 基于最短路的最小割

    题意:      给你一个平面图,让你输出(1,1),(n ,n)的最小割.. 思路:       看完题想都没想直接最大流,结果TLE,想想也是 G<400*400,400*400*4> ...

  6. hdu3870-Catch the Theves(平面图最小割)

    Problem Description A group of thieves is approaching a museum in the country of zjsxzy,now they are ...

  7. hdu 3870(平面图最小割转最短路)

    Catch the Theves Time Limit: 5000/2000 MS (Java/Others)    Memory Limit: 65768/32768 K (Java/Others) ...

  8. hdu4289 最小割最大流 (拆点最大流)

    最小割最大流定理:(参考刘汝佳p369)增广路算法结束时,令已标号结点(a[u]>0的结点)集合为S,其他结点集合为T=V-S,则(S,T)是图的s-t最小割. Problem Descript ...

  9. 最小割 总结&&做题记录

    模型要点: 1.一般适用于二取一问题或者01规划. 2.利用最小割=最大流,转化为最大流求之. 建议阅读胡伯涛的论文 <<最小割模型在信息学竞赛的应用>>,有精彩有序的证明和各 ...

随机推荐

  1. C++中对C的扩展学习新增语法——namespace

    NAMESPACE语法 namespace主要解决了命名冲突的问题,语法如下 Namespace注意事项: namespace中可以定义常量.变量.函数.结构体.枚举.类等. namespace 只能 ...

  2. django:runserver实现远程访问

    如果是在另一台电脑上web访问要用 python manage.py ip:port (一般使用8000)的形式:监听所有ip用0.0.0.0如下: 1 2 3 python manage.py ru ...

  3. 从surfaceflinger历史变更谈截屏

    众所周知,有一个程序screencap可以截屏,这个程序十分简单,只是使用了surfaceflinger服务的截屏功能. 所以要了解截屏,看surfaceflinger服务的代码是不二首选.但是sur ...

  4. 记一次LDAP主从同步配置

    LDAP主从同步 OpenLDAP在2.3版本之前的同步复制带有一系列缺点如只支持一主多从模式等,在此缺点就不多说,下文着重介绍一下OpenLDAP V2.4以后的同步负复制功能 同步功能 2.4版最 ...

  5. 堆 堆排序 优先队列 图文详解(Golang实现)

    引入 在实际应用中,我们经常需要从一组对象中查找最大值或最小值.当然我们可以每次都先排序,然后再进行查找,但是这种做法效率很低.哪么有没有一种特殊的数据结构,可以高效率的实现我们的需求呢,答案就是堆( ...

  6. Hadoop之HDFS文件系统

    概念 HDFS,它是一个文件系统,用于存储文件,通过目录树来定位文件:其次,它是分布式的,由很多服务器联合起来实现其功能,集群中的服务器有各自的角色. HDFS的设计适合一次写入,多次读出的场景,且不 ...

  7. (二)OpenStack---M版---双节点搭建---数据库安装和配置

    ↓↓↓↓↓↓↓↓视频已上线B站↓↓↓↓↓↓↓↓ >>>>>>传送门 本章节只在Controller节点执行 1.安装Mariadb数据库来存储信息 2.NoSQL数 ...

  8. scss--函数 (Functions)--unit

    (Sass::Script::Value::String) unit($number) Returns the unit(s) associated with a number. Complex un ...

  9. 为什么 Redis 是单线程的?

    以前一直有个误区,以为:高性能服务器 一定是 多线程来实现的 原因很简单因为误区二导致的:多线程 一定比 单线程 效率高.其实不然. 在说这个事前希望大家都能对 CPU . 内存 . 硬盘的速度都有了 ...

  10. linux 相关零碎知识整理

    1.启动bash shell 大部分linux系统启动用户命令行接口(cli)环境时使用默认的bash shell,在bash shell启动时,它将自动执行位于用户主目录下的.bashrc中的命令. ...