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. 部署django

    添加uwagi配置文件 在你项目的根目录中创建mysite.xml(名字无所谓),或者创建mysite.ini,输入以下内容: <uwsgi> <socket>127.0.0. ...

  2. 手把手教你用netty撸一个ZkClient

    原文地址: https://juejin.im/post/5dd296c0e51d4508182449a6 前言 有这个想法的缘由是前一阵子突发奇想, 想尝试能不能直接利用js连接到zookeeper ...

  3. 航空概论(历年资料,引之百度文库,PS:未调格式,有点乱)

    航空航天尔雅 选择题1. 已经实现了<天方夜谭>中的飞毯设想.—— A——美国2. 地球到月球大约—— C 38 万公里3. 建立了航空史上第一条定期空中路线—— B——德国4. 对于孔明 ...

  4. 查看Oracle的连接数

    select count(*) from v$process --当前连接数 select count(*) from v$process where program='ORACLE.EXE(SHAD ...

  5. Unittest框架的从零到壹(二)

    四大重要概念 在unittest文档中有四个重要的概念:Test Case.Test Suite.Test Runner和Test Fixture.只有理解了这几个概念,才能理解单元测试的基本特征. ...

  6. python容器类型元组的操作

    元组:使用小括号进行表示一组元素,其元素与元素之间使用逗号隔开:注意:元组的的值是不可修改的: 1.元组值得增加:元组是不可以直接增加值的,但是可以通过+进行拼接 # 声明一个元组: tuple1 = ...

  7. LoadRunner 录制问题集锦

    关键词:各路录制小白汇集于此 虽然知道君对录制不感冒,但总是看到扎堆的人说这些问题,忍不住要站出来了. 百度虽好,帮助了很多小白,但关键是百度并没有排除错误内容,经过历史的几年传播,错的都快变对的了, ...

  8. 2019-9-26:渗透测试,基础学习,nmap扫描kali虚拟机服务

    初识Nmap 1, 首先确定kali的ip地址,输入命令ifconfig 2, 开启所需要扫描的服务, 开启ssh:service ssh start, 确认ssh服务是否开启service ssh ...

  9. day 37 CSS

    参考博客:https://www.cnblogs.com/majj/p/9021419.html 1.CSS的三种链接样式: 行内链接(优先级最高) 内接样式 外接样式 <html lang=& ...

  10. day 22 面向对象的基础

    面向对象: 1.简述编写和执行类中的方法的流程 class Foo: #类的编写 def func(): print("我爱你") obj = Foo() #类的调用和执行 obj ...