HDU 3035 War 平面最小割+优先队列优化的dij

2024-04-22 07:48

本文主要是介绍HDU 3035 War 平面最小割+优先队列优化的dij,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

题意:给一个矩形图(具体看图),左上角的点为起点,右下角的点为终点。图中每一条边都有权值,所以要是想切断一些边,使得起点终点不能相通,问需要切掉边的最小权值。


想法:网络流最小割当然可以做,但是点有501*501+500*500,很尴尬太多了。所以可以从左下角,向右上角切割来阻断路径(平面最小割)。这个要把每一个被线分割的区域当做一个点,每个区域之间的线的权值为边的权值。这个里面有一个类似的图HDU 3870 Catch the Theves 最短路求最小割   


#include<iostream>
#include<cstring>
#include<cstdio>
#include<queue>
#define inf 0x7fffffff
using namespace std;
const int nodes=505*505*5;
const int edges=505*505*16;
int n,m,st,ed;
int hang[505][505],shu[505][505],cha[1005][1005];
int vis[nodes],dis[nodes];
struct node 
{int v,next,w;
}e[edges];
struct nodee
{int v,dis;nodee() {}nodee(int v1,int dis1):v(v1),dis(dis1){}bool operator < (const nodee a)const{return a.dis<dis;}
};
int head[nodes],cnt;
void Init()
{memset(head,-1,sizeof(head));cnt=0;
}
void add(int a,int b,int c)
{e[cnt].v=b;e[cnt].w=c;e[cnt].next=head[a];head[a]=cnt++;
}
void build_map()
{st=0;ed=n*m*4+1;for(int i=1;i<=n;i++)//左边 {int num=2*n*m+((i-1)*m+1)*2-1;add(st,num,shu[i][1]);}for(int i=1;i<=n;i++)//右边 {int num=2*n*m+((i-1)*m+m)*2;add(num,ed,shu[i][m+1]);}for(int i=1;i<=m;i++)//下边 {int num=(2*n-1)*m+i;add(st,num,hang[n+1][i]);}for(int i=1;i<=m;i++)//上边 {int num=(2*1-1)*m+i-m;add(num,ed,hang[1][i]);}for(int i=1;i<=n;i++){for(int j=1;j<=m;j++){int numz=2*n*m+((i-1)*m+j)*2-1;int numy=2*n*m+((i-1)*m+j)*2;int nums=(2*i-1)*m+j-m;int numx=(2*i-1)*m+j;add(numz,nums,cha[2*i-1][2*j-1]);add(numy,nums,cha[2*i-1][2*j]);add(numx,numz,cha[2*i][2*j-1]);add(numx,numy,cha[2*i][2*j]);add(nums,numz,cha[2*i-1][2*j-1]);add(nums,numy,cha[2*i-1][2*j]);add(numz,numx,cha[2*i][2*j-1]);add(numy,numx,cha[2*i][2*j]);if(j!=m){add(numy,numy+1,shu[i][j+1]);add(numy+1,numy,shu[i][j+1]);}if(i!=1){add(nums,nums-m,hang[i][j]);add(nums-m,nums,hang[i][j]);}}} 
}
void dij()
{for(int i=st;i<=ed;i++){dis[i]=inf;vis[i]=0;}dis[st]=0;priority_queue<nodee>q;q.push(nodee(st,0));while(!q.empty()){int u=q.top().v;q.pop();if(u==ed) break;if(vis[u]) continue;vis[u]=1;for(int i=head[u];i+1;i=e[i].next){int v=e[i].v;if(!vis[v]&&dis[v]>dis[u]+e[i].w){dis[v]=dis[u]+e[i].w;q.push(nodee(v,dis[v]));}}}printf("%d\n",dis[ed]);
}
int main()
{while(~scanf("%d%d",&n,&m)){for(int i=1;i<=n+1;i++)//(n+1)*m{for(int j=1;j<=m;j++)scanf("%d",&hang[i][j]);}for(int i=1;i<=n;i++)//n*(m+1){for(int j=1;j<=m+1;j++)scanf("%d",&shu[i][j]);}for(int i=1;i<=2*n;i++)//2n*2m {for(int j=1;j<=2*m;j++)scanf("%d",&cha[i][j]);}Init();build_map(); dij();}return 0;} 




这篇关于HDU 3035 War 平面最小割+优先队列优化的dij的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/925193

相关文章

Vue3 的 shallowRef 和 shallowReactive:优化性能

大家对 Vue3 的 ref 和 reactive 都很熟悉,那么对 shallowRef 和 shallowReactive 是否了解呢? 在编程和数据结构中,“shallow”(浅层)通常指对数据结构的最外层进行操作,而不递归地处理其内部或嵌套的数据。这种处理方式关注的是数据结构的第一层属性或元素,而忽略更深层次的嵌套内容。 1. 浅层与深层的对比 1.1 浅层(Shallow) 定义

HDFS—存储优化(纠删码)

纠删码原理 HDFS 默认情况下,一个文件有3个副本,这样提高了数据的可靠性,但也带来了2倍的冗余开销。 Hadoop3.x 引入了纠删码,采用计算的方式,可以节省约50%左右的存储空间。 此种方式节约了空间,但是会增加 cpu 的计算。 纠删码策略是给具体一个路径设置。所有往此路径下存储的文件,都会执行此策略。 默认只开启对 RS-6-3-1024k

hdu1180(广搜+优先队列)

此题要求最少到达目标点T的最短时间,所以我选择了广度优先搜索,并且要用到优先队列。 另外此题注意点较多,比如说可以在某个点停留,我wa了好多两次,就是因为忽略了这一点,然后参考了大神的思想,然后经过反复修改才AC的 这是我的代码 #include<iostream>#include<algorithm>#include<string>#include<stack>#include<

使用opencv优化图片(画面变清晰)

文章目录 需求影响照片清晰度的因素 实现降噪测试代码 锐化空间锐化Unsharp Masking频率域锐化对比测试 对比度增强常用算法对比测试 需求 对图像进行优化,使其看起来更清晰,同时保持尺寸不变,通常涉及到图像处理技术如锐化、降噪、对比度增强等 影响照片清晰度的因素 影响照片清晰度的因素有很多,主要可以从以下几个方面来分析 1. 拍摄设备 相机传感器:相机传

springboot3打包成war包,用tomcat8启动

1、在pom中,将打包类型改为war <packaging>war</packaging> 2、pom中排除SpringBoot内置的Tomcat容器并添加Tomcat依赖,用于编译和测试,         *依赖时一定设置 scope 为 provided (相当于 tomcat 依赖只在本地运行和测试的时候有效,         打包的时候会排除这个依赖)<scope>provided

usaco 1.3 Mixing Milk (结构体排序 qsort) and hdu 2020(sort)

到了这题学会了结构体排序 于是回去修改了 1.2 milking cows 的算法~ 结构体排序核心: 1.结构体定义 struct Milk{int price;int milks;}milk[5000]; 2.自定义的比较函数,若返回值为正,qsort 函数判定a>b ;为负,a<b;为0,a==b; int milkcmp(const void *va,c

poj 3974 and hdu 3068 最长回文串的O(n)解法(Manacher算法)

求一段字符串中的最长回文串。 因为数据量比较大,用原来的O(n^2)会爆。 小白上的O(n^2)解法代码:TLE啦~ #include<stdio.h>#include<string.h>const int Maxn = 1000000;char s[Maxn];int main(){char e[] = {"END"};while(scanf("%s", s) != EO

hdu 2093 考试排名(sscanf)

模拟题。 直接从教程里拉解析。 因为表格里的数据格式不统一。有时候有"()",有时候又没有。而它也不会给我们提示。 这种情况下,就只能它它们统一看作字符串来处理了。现在就请出我们的主角sscanf()! sscanf 语法: #include int sscanf( const char *buffer, const char *format, ... ); 函数sscanf()和

hdu 2602 and poj 3624(01背包)

01背包的模板题。 hdu2602代码: #include<stdio.h>#include<string.h>const int MaxN = 1001;int max(int a, int b){return a > b ? a : b;}int w[MaxN];int v[MaxN];int dp[MaxN];int main(){int T;int N, V;s

poj 1258 Agri-Net(最小生成树模板代码)

感觉用这题来当模板更适合。 题意就是给你邻接矩阵求最小生成树啦。~ prim代码:效率很高。172k...0ms。 #include<stdio.h>#include<algorithm>using namespace std;const int MaxN = 101;const int INF = 0x3f3f3f3f;int g[MaxN][MaxN];int n