BZOJ1001 狼抓兔子 终于过了!

    时间来不及了,先贴代码吧!有时间再写。

   好苦逼啊,WA了若干次,还有一次RE,一次TLE。

   虽然主要运用的算法和资料都由师兄提供了。还是太弱了,太天真了。

   首先,数据范围就WA了,RE了,TLE了。

   然后构图上有bug。最后还是仿着师兄的把构图重新写了。加油吧!

  这道题的主要思路首先应该是网络流中的最小割,但由于数据范围太大,直接用最小割的算法会TLE,而且没有正确地利用题目特征,这道题的图是个S-T图,我们可以建出原图的对偶图,然后跑一次dijkstra()。详情请参考《浅析最大最小定理在信息学竞赛中的应用》。

   一个网格图中求最小割,很特殊的是这个图是一个平面图,最小割=最大流=对偶图中最短路(平面图)。

  1 #include<cstdio>
  2 #include<iostream>
  3 #include<queue>
  4 #include<cstring>
  5 #define maxn 2100009
  6 #define rep(i,j,k) for(int i = j; i <= k; i++)
  7 using namespace std;
  8 
  9 int read()
 10 {
 11     int s = 0, t = 1; char c = getchar();
 12     while( !isdigit(c) ) {
 13         if( c == '-' ) t = -1; c = getchar();
 14     }
 15     while( isdigit(c) ){
 16         s = s * 10 + c - '0'; c = getchar();
 17     } 
 18     return s * t;
 19 }
 20 
 21 int d[maxn], n, m, sx, tx;
 22 bool done[maxn] = {0}; 
 23 
 24 struct node{
 25 int d, u;
 26 bool operator < (const node& rhs) const{
 27         return d > rhs.d;
 28      }
 29 };
 30 
 31 struct edge{
 32 int to, key;
 33 edge* next;
 34 };
 35 
 36 edge *pt, edges[maxn*3], *head[maxn];
 37 
 38 void add_edge(int x,int y,int val){
 39    pt->to = y;pt->key = val;
 40    pt->next = head[x];
 41    head[x] = pt++;
 42    pt->to = x, pt->key= val;
 43    pt->next = head[y];
 44    head[y] = pt++; 
 45 }
 46 priority_queue<node> Q;
 47 
 48 void dijkstra()
 49 {
 50      memset(d,127,sizeof(d));
 51      d[sx] = 0;
 52      Q.push((node){0,sx});
 53      while( !Q.empty() ){
 54         node x = Q.top(); Q.pop();
 55         int u = x.u;
 56         if( done[u] ) continue;
 57         done[u] = 1;
 58         for( edge*i = head[u]; i ; i = i->next ){
 59             int y = i->to, key = i->key;
 60             if( d[y] > d[u]+key ) {
 61                 d[y] = d[u]+key;
 62                 Q.push((node){d[y],y});
 63             }
 64         }
 65      }
 66 }
 67 
 68 int main()
 69 {
 70     //freopen("out.txt","w",stdout);
 71    pt = edges;
 72    n = read(), m = read(); 
 73    sx = 0, tx = (n-1)*(m-1) * 2+ 1;
 74    rep(i,0,n-1) {
 75       int xx = (2*m-2)*i;
 76       int xy = (2*m-2)*(i-1);
 77       rep(j,1,m-1){
 78          int x = read();
 79          if( !i ) {
 80             add_edge(xx+2*j,tx,x);
 81             //cout<<tx<<" "<<xx+2*j+1<<" "<<x<<endl;
 82          } 
 83          else if( i == n-1 ) {
 84             add_edge(sx,xy+2*j-1,x);
 85             //cout<<xy+2*j<<" "<<sx<<" "<<x<<endl;
 86          }
 87          else{
 88             add_edge(xx+2*j,xy+2*j-1,x);
 89             //cout<<xy+2*j<<" "<<xx+2*j+1<<" "<<x<<endl;
 90          }
 91       }
 92    }
 93    rep(i,0,n-2){
 94       int xx = 2*(m-1)*(i);
 95       rep(j,1,m){
 96          int x = read();
 97          if( j == 1 ){
 98             add_edge(sx,xx+2*j-1,x);
 99             //cout<<sx<<" "<<xx<<" "<<x<<endl;
100          } 
101          else if( j == m ){
102             add_edge(tx,xx+2*j-2,x);
103             //cout<<tx<<" "<<xx+2*j-1<<" "<<x<<endl;
104          }
105          else {
106             add_edge(xx+2*j-2,xx+2*j-1,x);
107             //cout<<xx+2*j<<" "<<xx+2*j-1<<" "<<x<<endl;
108          }
109       }
110    }
111    rep(i,0,n-2){
112      int xx = 2*(m-1)*(i); 
113      rep(j,1,m-1){
114         int x = read();
115         add_edge(xx+2*j,xx+2*j-1,x);
116         //cout<<xx+2*j<<" "<<xx+2*j+1<<" "<<endl;
117      }
118    }
119    dijkstra();
120    cout<<d[tx]<<endl;
121    return 0;
122 }

    不过,也想请大神把我指出下面这份代码错哪了?

  1 #include<cstdio>
  2 #include<iostream>
  3 #include<queue>
  4 #include<cstring>
  5 #define maxn 2100009
  6 #define sx   2100000
  7 #define tx   2100001
  8 #define rep(i,j,k) for(int i = j; i <= k; i++)
  9 using namespace std;
 10  
 11 int read()
 12 {
 13     int s = 0, t = 1; char c = getchar();
 14     while( !isdigit(c) ) {
 15         if( c == '-' ) t = -1; c = getchar();
 16     }
 17     while( isdigit(c) ){
 18         s = s * 10 + c - '0'; c = getchar();
 19     } 
 20     return s * t;
 21 }
 22  
 23 int d[maxn], n, m;
 24 bool done[maxn] = {0}; 
 25  
 26 struct node{
 27 int d, u;
 28 bool operator < (const node& rhs) const{
 29         return d > rhs.d;
 30      }
 31 };
 32  
 33 struct edge{
 34 int to, key;
 35 edge* next;
 36 };
 37  
 38 edge *pt, edges[maxn*3], *head[maxn];
 39  
 40 void add_edge(int x,int y,int val){
 41    pt->to = y;pt->key = val;
 42    pt->next = head[x];
 43    head[x] = pt++;
 44    pt->to = x, pt->key= val;
 45    pt->next = head[y];
 46    head[y] = pt++; 
 47 }
 48 priority_queue<node> Q;
 49  
 50 void dijkstra()
 51 {
 52      memset(d,127,sizeof(d));
 53      d[sx] = 0;
 54      Q.push((node){0,sx});
 55      while( !Q.empty() ){
 56         node x = Q.top(); Q.pop();
 57         int u = x.u;
 58         if( done[u] ) continue;
 59         done[u] = 1;
 60         for( edge*i = head[u]; i ; i = i->next ){
 61             int y = i->to, key = i->key;
 62             if( d[y] > d[u]+key ) {
 63                 d[y] = d[u]+key;
 64                 Q.push((node){d[y],y});
 65             }
 66         }
 67      }
 68 }
 69  
 70 int main()
 71 {
 72     //freopen("out.txt","w",stdout);
 73    pt = edges;
 74    n = read(), m = read(); 
 75    rep(i,0,n-1) {
 76       int xx = (2*m-2)*i;
 77       int xy = (2*m-2)*(i-1);
 78       rep(j,0,m-2){
 79          int x = read();
 80          if( !i ) {
 81             add_edge(xx+2*j+1,tx,x);
 82             //cout<<tx<<" "<<xx+2*j+1<<" "<<x<<endl;
 83          } 
 84          else if( i == n-1 ) {
 85             add_edge(sx,xy+2*j,x);
 86             //cout<<xy+2*j<<" "<<sx<<" "<<x<<endl;
 87          }
 88          else{
 89             add_edge(xx+2*j+1,xy+2*j,x);
 90             //cout<<xy+2*j<<" "<<xx+2*j+1<<" "<<x<<endl;
 91          }
 92       }
 93    }
 94    rep(i,0,n-2){
 95       int xx = 2*(m-1)*(i);
 96       rep(j,0,m-1){
 97          int x = read();
 98          if( !j ){
 99             add_edge(sx,xx,x);
100             //cout<<sx<<" "<<xx<<" "<<x<<endl;
101          } 
102          else if( j == m-1 ){
103             add_edge(tx,xx+2*j-1,x);
104             //cout<<tx<<" "<<xx+2*j-1<<" "<<x<<endl;
105          }
106          else {
107             add_edge(xx+2*j,xx+2*j-1,x);
108             //cout<<xx+2*j<<" "<<xx+2*j-1<<" "<<x<<endl;
109          }
110       }
111    }
112    rep(i,0,n-2){
113      int xx = 2*(m-1)*(i); 
114      rep(j,0,m-2){
115         int x = read();
116         add_edge(xx+2*j,xx+2*j+1,x);
117         //cout<<xx+2*j<<" "<<xx+2*j+1<<" "<<endl;
118      }
119    }
120    dijkstra();
121    cout<<d[tx]<<endl;
122    return 0;
123 }

 

1001: [BeiJing2006]狼抓兔子

Time Limit: 15 Sec  Memory Limit: 162 MB
Submit: 14595  Solved: 3490
[Submit][Status][Discuss]

Description

现在小朋友们最喜欢的"喜羊羊与灰太狼",话说灰太狼抓羊不到,但抓兔子还是比较在行的,而且现在的兔子还比较笨,它们只有两个窝,现在你做为狼王,面对下面这样一个网格的地形:

 

左上角点为(1,1),右下角点为(N,M)(上图中N=4,M=5).有以下三种类型的道路 1:(x,y)<==>(x+1,y) 2:(x,y)<==>(x,y+1) 3:(x,y)<==>(x+1,y+1) 道路上的权值表示这条路上最多能够通过的兔子数,道路是无向的. 左上角和右下角为兔子的两个窝,开始时所有的兔子都聚集在左上角(1,1)的窝里,现在它们要跑到右下解(N,M)的窝中去,狼王开始伏击这些兔子.当然为了保险起见,如果一条道路上最多通过的兔子数为K,狼王需要安排同样数量的K只狼,才能完全封锁这条道路,你需要帮助狼王安排一个伏击方案,使得在将兔子一网打尽的前提下,参与的狼的数量要最小。因为狼还要去找喜羊羊麻烦.

Input

第一行为N,M.表示网格的大小,N,M均小于等于1000.接下来分三部分第一部分共N行,每行M-1个数,表示横向道路的权值. 第二部分共N-1行,每行M个数,表示纵向道路的权值. 第三部分共N-1行,每行M-1个数,表示斜向道路的权值. 输入文件保证不超过10M

Output

输出一个整数,表示参与伏击的狼的最小数量.

Sample Input

3 4
5 6 4
4 3 1
7 5 3
5 6 7 8
8 7 6 5
5 5 5
6 6 6

转载于:https://www.cnblogs.com/83131yyl/p/5046130.html

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/289635.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

如何使用GeneralUpdte构建客户端自动升级功能

一、概要本篇文章将向各位小伙伴介绍GeneralUpdate组件的使用&#xff0c;帮助第一次接触开发者快速上手应用在自己或企业项目中。如果本篇文章对您有帮助&#xff0c;希望帮忙点一下star。感谢各位开发者的支持。帮助文档讲解视频&#xff1a;https://www.bilibili.com/video/…

30道四则运算题目---课堂作业--软件工程c++

问题&#xff1a;设计一程序&#xff0c;给二年级小学生随机产生四则运算题目。 一、设计思考问题&#xff1a; 1.四则运算需要俩个运算数和一个运算符。 2.如何产生随机数? 3.如何实现随机产生四则运算&#xff1f; 4.题目是否符合小学生学习范围&#xff1f;&#xff08;减法…

javascript 函数属性prototype(转)

在JavaScript中并没有类的概念&#xff0c;但javascript中的确可以实现重载&#xff0c;多态&#xff0c;继承。这些实现其实方法都可以用JavaScript中的引用和变量作用域结合prototype来解释。 1、prototype 在JavaScript中并没有类的概念&#xff0c;但JavaScript中的确可以实…

java离职交接文档_财务人员工作交接你知道么?没处理好不止将来风险大还可能违法...

今天给大家分享一下在工作中&#xff0c;财务人员应该怎么保护自己&#xff1f;1.虚假报销那些事儿在企业内部报销程序中&#xff0c;部分管理人员往往安排下属或助理经办报销程序&#xff0c;所有的费用申请、报销单据的填写均系下属完成&#xff0c;而一旦虚假报销案件浮出水…

SQL Server 数据库没有有效所有者的三种解决办法

问题描述: 开发的过程中,操作系统出了问题,决定重装系统。但是没有将SQL Server中的数据库文件分离出来,直接将系统格了。在新系统数据库中附加了数据库文件,一切还算正常,但当打开数据库关系图的时候出现了问题,如下图所示: 针对以上问题,网上有很多解决办法,但是由…

Javascript:原型模式类继承

原型模式每个函数&#xff08;准确说不是类、对象&#xff09;都有一个prototype属性&#xff0c;这个属性是一个指针&#xff0c;指向一个对象。使用原型对象的好处是可以让所有对象实例共享它包含的属性和方法。1.原型对象&#xff08;1&#xff09;当创建一个新函数&#xf…

C# 学习经验分享

NET 20 周年的学习挑战赛刚结束了第⼀阶段&#xff0c;不知道各位⼩伙伴参加了没有&#xff1f;有⼈问现在学习 C# 是不是有点过时&#xff1f;也有⼈问现在C# 能做什么&#xff1f;更有⼈问学习 C# 能否找到⼯作 &#xff1f;或者你从不同的专家&#xff0c;不同的从业者可以有…

有限服务器延时计算_机房设备功率统计,UPS不间断电源和蓄电池的计算选择

当然了&#xff0c;也可以不用这么麻烦&#xff0c;网上有UPS计算器的&#xff0c;输入条件直接求个结果就行了。弱电笔记&#xff5c;弱电&#xff08;安防&#xff09;计算器诺&#xff0c;就上面那个&#xff01;下面进入正文&#xff1a;一个计算机机房有4台PC机&#xff0…

linux把2块盘挂到一个分区,linux系统如何挂载第二块硬盘

云主机有两块硬盘&#xff0c;第一块硬盘盘一般为10G&#xff0c;用于安装系统&#xff0c;第二块磁盘根据云主机类型不同&#xff0c;大小也不相同。我们建议您在使用的时候第二块硬盘作为数据盘&#xff0c;存放你的网站数据&#xff0c;这样在您恢复系统的时候&#xff0c;数…

Visual Studio/SQL Server系统开发常见问题归纳

问题1.在利用C Sharp(操作系统为Windows7 64位)将Excel数据导入到SQL Server 2005中时,出现如下提示: 解决办法:VS菜单栏 生成→“配置管理器→平台→新建→x86。

Xamarin效果第十八篇之GIS中复合型Mark

在前面一篇文章中简单在GIS上添加了最基础的Mark,今天再次分享一下早几天摸索的复合型Mark;啥也不说了都在效果里:1、关于数据我就是直接抓的高德的(至于后面需要的参数那就自行抓):https://restapi.amap.com/v3/airquality/aqilist?2、至于Mark无非就是用了CompositeSymbol:C…

WPF定时刷新UI界面

代码&#xff1a; using NHibernate.Criterion; using System; using System.Collections.Generic; using System.Collections.ObjectModel; using System.ComponentModel; using System.Data; using System.Linq; using System.Text; using System.Threading; using System.Wi…

找不到libmmd.dll无法继续执行代码_300 行代码带你秒懂 Java 多线程!| 原力计划...

作者 | 永远在路上【】责编 | 胡巍巍出品 | CSDN博客线程线程的概念&#xff0c;百度是这样解释的&#xff1a;线程(英语&#xff1a;Thread)是操作系统能够进行运算调度的最小单位。它被包含在进程之中&#xff0c;是进程中的实际运作单位。一条线程指的是进程中一个单一顺序的…

苹果、联想及华硕均看准美国电脑运输的增长

据国外媒体雅虎金融报道&#xff0c;根据国际数据公司的研究&#xff0c;美国个人电脑在4Q14中下跌至1820万台&#xff0c;在4Q15中下跌至1740万台&#xff0c;跌幅4.3%。而苹果、联想和华硕的产品出货量却呈现上市趋势。苹果出货量上升8.9%&#xff0c;至220万台&#xff0c;华…

如何升级浏览器_前谷歌员工爆料:谷歌工程师们是如何合谋“杀死”IE6浏览器的...

浏览器在互联网中的地位可见一斑&#xff0c;甚至可以说&#xff0c;它是比搜索引擎和社交软件更强的流量入口。微软IE6当年在2001年作为Windows XP的默认浏览器发布&#xff0c;比Chrome首次发布还要早六年。 但是&#xff0c;谷歌Chrome却后来居上&#xff0c;如今的市场份额…

安卓设备刷linux发行版,绝对精华,大牛教你在Android系统上安装linux发行版

Install linux distribution(Debian/Ubuntu/Kali Linux/Fedora/openSUSE/Gentoo/RootFS/Arch Linux) on Android system在Android系统上安装linux发行版(Debian/Ubuntu/Kali Linux/Fedora/openSUSE/Gentoo/RootFS/Arch Linux)1、所用的手机类型为Samsung Note2 Verizon i6052、…

在 ASP.NET Core 中使用 HTTP 标头传播

前言我们常用 JWT 令牌用于身份验证&#xff0c;前端一般是在请求中包含 HTTP 标头 Authorization 实现。但是&#xff0c;当服务间需要互相调用时&#xff0c;也需要"按原样"将标头传播到目标服务。原来的解决方案是从请求中读取标头&#xff0c;并将其添加到对外请…

中英文标点符号切换的组合键_易混标点符号:一字线(—)、短横线(-)、浪纹线(~)...

前情提要&#xff1a;上次辨析了容易混淆的中英文冒号&#xff08;&#xff1a;、:&#xff09;、比号&#xff08;∶&#xff09;【点此查看】&#xff0c;这次继续介绍易混标点符号。易混标点符号&#xff1a;一字线&#xff08;—&#xff09;、短横线&#xff08;-&#xf…

Linux命令-网络命令:wall

wall hello word 向所有登录用户发送消息hello world root用户自己也会收到消息,wangyunpeng用户收到消息如下图:

win定时关机_两种方法让你设置电脑定时关机

方法一&#xff1a;利用计划程序步骤一&#xff1a;在开始菜单搜索框中输入计划任务&#xff0c;点击任务计划程序步骤二&#xff1a;点击操作再点击创建基本任务创建基本任务中输入名称和相关描述步骤三&#xff1a;触发器选择为每天&#xff0c;然后点击下一步步骤四&#xf…