【题目分析】

可以知道,所有的海拔是0或1

最小割转最短路,就可以啦

SPFA被卡,只能换DIJ

【代码】

#include <cstdio>
#include <cstring>

#include <iostream>
#include <algorithm>
#include <queue>

using namespace std;

#define maxn 2000005

int h[maxn],to[maxn],ne[maxn],w[maxn],en=0;

int read()
{
    int x=0,f=1; char ch=getchar();
    while (ch<'0'||ch>'9') {if (ch=='-') f=-1; ch=getchar();}
    while (ch>='0'&&ch<='9') {x=x*10+ch-'0'; ch=getchar();}
    return x*f;
}

int dis[maxn];
struct cmp{
    bool operator () (const int &a,const int &b)
    {return dis[a]>dis[b];}
};

struct Table
{
    int h[maxn],ne[maxn],to[maxn],w[maxn],vis[maxn];
    priority_queue <int,vector <int>,cmp> q;
    int en;
    void init()
    {
        memset(h,-1,sizeof h);
        en=0;
        while (!q.empty()) q.pop();
    }
    void add(int a,int b,int c)
    {
        ne[en]=h[a];
        to[en]=b;
        w[en]=c;
        h[a]=en++;
    }
    void dij(int s)
    {
        memset(dis,0x3f,sizeof dis);
        memset(vis,0,sizeof vis);
        dis[s]=0;
        q.push(s);
        vis[s]=1;
        while (!q.empty())
        {
            int x=q.top(); q.pop(); vis[x]=0;
            for (int i=h[x];i>=0;i=ne[i])
            {
                if (dis[to[i]]>dis[x]+w[i])
                {
                    dis[to[i]]=dis[x]+w[i];
                    if (!vis[to[i]])
                    {
                        vis[to[i]]=1;
                        q.push(to[i]);
                    }
                }
            }
        }
    }
}map;

void add(int a,int b,int c)
{
	to[en]=b;
	ne[en]=h[a];
	w[en]=c;
	h[a]=en++;
}

int n,S=0,T=maxn-1;
int hash[605][605],cnt=0;
int inq[maxn];

void SPFA()
{
	queue <int> q;
	memset(dis,0x3f,sizeof dis);
	while (!q.empty()) q.pop();
	q.push(S); inq[S]=1; dis[S]=0;
	while (!q.empty())
	{
		int x=q.front(); q.pop(); inq[x]=0;
		for (int i=h[x];i>=0;i=ne[i])
		{
			if (dis[to[i]]>dis[x]+w[i])
			{
				dis[to[i]]=dis[x]+w[i];
				if (!inq[to[i]])
				{
					inq[to[i]]=1;
					q.push(to[i]);
				}
			}
		}
	}
	printf("%d\n",dis[T]);
}

int main()
{
	map.init();
	memset(h,-1,sizeof h);
	n=read();
	for (int i=0;i<=n+1;++i)
		for (int j=0;j<=n+1;++j)
			hash[i][j]=++cnt;
	for (int i=0;i<=n+1;++i) hash[0][i]=maxn-1;
	for (int i=0;i<=n+1;++i) hash[n+1][i]=0;
	for (int i=0;i<=n+1;++i) hash[i][0]=0;
	for (int i=0;i<=n+1;++i) hash[i][n+1]=maxn-1;
	for (int i=1;i<=n+1;++i)
		for (int j=1;j<=n;++j)
		{
			int tmp=read();
			map.add(hash[i][j],hash[i-1][j],tmp);
		}
	for (int i=1;i<=n;++i)
		for (int j=1;j<=n+1;++j)
		{
			int tmp=read();
			map.add(hash[i][j-1],hash[i][j],tmp);
		}
	for (int i=1;i<=n+1;++i)
		for (int j=1;j<=n;++j)
		{
			int tmp=read();
			map.add(hash[i-1][j],hash[i][j],tmp);
		}
	for (int i=1;i<=n;++i)
		for (int j=1;j<=n+1;++j)
		{
			int tmp=read();
			map.add(hash[i][j],hash[i][j-1],tmp);
		}
	map.dij(S);
	printf("%d\n",dis[T]);
}

  

NOI 2010 海拔 ——平面图转对偶图的更多相关文章

  1. BZOJ2007 NOI2010 海拔 平面图转对偶图 最小割

    题面太长啦,请诸位自行品尝—>海拔 分析: 这是我见过算法比较明显的最小割题目了,很明显对于某一条简单路径,海拔只会有一次变换. 而且我们要最终使变换海拔的边权值和最小. 我们发现变换海拔相当于 ...

  2. [NOI2010]海拔 平面图转对偶图 最小割

    题解: 首先,我们不难猜到高度只有 $0$ 或 $1$ 两种可能,而且高度为 0 的地区组成一个联通块,高度为 1 的地区组成一个联通块.只有这样,人们所耗费的体力才是最小的.得出这个结论,题目就成了 ...

  3. NOI 2010 海拔(最小割转最短路)

    题意 https://www.lydsy.com/JudgeOnline/problem.php?id=2007 思路 首先可以发现一个结论,每个位置的海拔只有能是 \(0\) 和 \(1\) ,然后 ...

  4. P2046 [NOI2010]海拔 平面图转对偶图(最小割-》最短路)

    $ \color{#0066ff}{ 题目描述 }$ YT市是一个规划良好的城市,城市被东西向和南北向的主干道划分为n×n个区域.简单起见,可以将YT市看作 一个正方形,每一个区域也可看作一个正方形. ...

  5. ●BZOJ 2007 NOI 2010 海拔

    题链: http://www.lydsy.com/JudgeOnline/problem.php?id=2007 题解: 网络流.最小割.对偶图 奇妙的题 ~ 种种原因导致了高度要么为 0,要么为 1 ...

  6. 【BZOJ-2007】海拔 最小割 (平面图转对偶图 + 最短路)

    2007: [Noi2010]海拔 Time Limit: 20 Sec  Memory Limit: 552 MBSubmit: 2095  Solved: 1002[Submit][Status] ...

  7. 【BZOJ2007】【NOI2010】海拔(最小割,平面图转对偶图,最短路)

    [BZOJ2007][NOI2010]海拔(最小割,平面图转对偶图,最短路) 题面 BZOJ 洛谷 Description YT市是一个规划良好的城市,城市被东西向和南北向的主干道划分为n×n个区域. ...

  8. 【BZOJ 2007】 2007: [Noi2010]海拔 (平面图转对偶图+spfa)

    2007: [Noi2010]海拔 Time Limit: 20 Sec  Memory Limit: 552 MBSubmit: 2504  Solved: 1195 Description YT市 ...

  9. bzoj2007/luoguP2046 海拔(平面图最小割转对偶图最短路)

    bzoj2007/luoguP2046 海拔(平面图最小割转对偶图最短路) 题目描述: bzoj  luogu 题解时间: 首先考虑海拔待定点的$h$都应该是多少 很明显它们都是$0$或$1$,并且所 ...

随机推荐

  1. HTML-如何让自己的网页标题处可以显示网站的logo?

    <link rel="Bookmark" href="/forum_images/ffico.png" /> <link rel=" ...

  2. CLI:如何使用Go开发命令行

    CLI或者"command line interface"是用户在命令行下交互的程序.由于通过将程序编译到一个静态文件中来减少依赖,一次Go特别适合开发CLI程序.如果你编写过安装 ...

  3. asp.net 的页面几种传值方式

    http://www.cnblogs.com/makqiq/p/5882448.html 1.Querystring Querystring也叫查询字符串,这种页面间传递数据是利用网页地址URL.如果 ...

  4. HTTP超文本传输协议-HTTP/1.1中文版

    摘要 超文本传输协议(HTTP)是一种为分布式,合作式,多媒体信息系统服务,面向应用层的协议.它是一种通用的,不分状态(stateless)的协议,除了诸如名称服务和分布对象管理系统之类的超文本用途外 ...

  5. C语言基础(4)-原码,反码,补码及sizeof关键字

    1. 原码 +7的原码是0000 0111 -7的原码是1000 0111 +0的原码是0000 0000 -0的原码是1000 0000 2. 反码 一个数如果值为正,那么反码和原码相同. 一个数如 ...

  6. 2015.4.25-2015.5.1 字符串去重,比例圆设计,中奖机和canvas橡皮擦效果等

    1.字符串去重,html模板取值   2.javascript正则表达式之$1...$9   3.jquery插件   4.返回上一页并刷新 解决方法: <a href ="javas ...

  7. 扼杀 304,Cache-Control: immutable

    随着近些年社交网站的流行,越来越多的人学会了“刷”网页 ── 刷微博,刷朋友圈,刷新闻,刷秒杀页.这里的“刷”,就是刷新的意思,在浏览器里,你可以通过点击刷新按钮,或者用快捷键,或者移动端的下拉操作来 ...

  8. FMDB线程安全

    //打开数据库 如果没有就创建    NSString *path = [[NSSearchPathForDirectoriesInDomains(NSDocumentDirectory, NSUse ...

  9. HK&&CC JS学习:第一周——NO.2this

    1)常用的命名规范:     aXXXX:aBtn 说明获取的是一组元素:--类数组     oXXX:oBtn 说明获取的是一个元素->对象         对象有两个重要的特点:属性 和 方 ...

  10. MapReduce的核心资料索引 [转]

    转自http://prinx.blog.163.com/blog/static/190115275201211128513868/和http://www.cnblogs.com/jie46583173 ...