bzoj1001

神题。。

 1 #include<bits/stdc++.h>
 2 #define lowbit(a) ((a)&(-(a)))
 3 #define clr(a,x) memset(a,x,sizeof(a))
 4 #define rep(i,l,r) for(int i=l;i<(r);i++)
 5 typedef long long ll;
 6 using namespace std;
 7 int read()
 8 {
 9     char c=getchar();
10     int ans=0,f=1;
11     while(!isdigit(c)){
12         if(c==‘-‘) f=-1;
13         c=getchar();
14     }
15     while(isdigit(c)){
16         ans=ans*10+c-‘0‘;
17         c=getchar();
18     }
19     return ans*f;
20 }
21 struct node{
22     int num,d;
23     inline bool operator<(const node&A)const{
24         return d>A.d;
25     }
26 };
27 struct edge{
28     int to,w;
29 };
30 const int maxn=2000009,inf=0x3fffffff;
31 int N,n,m,d[maxn];
32 vector<edge>e[maxn];
33 void addedge(int u,int v,int w){
34     edge ed;
35     ed.to=v,ed.w=w;
36     e[u].push_back(ed);
37     ed.to=u;
38     e[v].push_back(ed);
39 }
40 int dijkstra(int u,int v){
41     priority_queue<node>Q;
42     node start;
43     start.d=0;start.num=u;
44     Q.push(start);
45     rep(i,1,N+1) d[i]=inf;
46     d[0]=0;
47     while(!Q.empty()){
48         node now=Q.top();Q.pop();
49         int q=now.num;
50         if(now.d!=d[q]) continue;
51         rep(i,0,e[q].size()){
52             int to=e[q][i].to,w=e[q][i].w;
53             if(d[to]>d[q]+w){
54                 d[to]=d[q]+w;
55                 node next;
56                 next.d=d[to];next.num=to;
57                 Q.push(next);
58             }
59         }
60     }
61     return d[v];
62 }
63 int main()
64 {
65     n=read(),m=read();
66     N=(n-1)*(m-1)*2+1;
67     rep(i,0,n){
68         rep(j,1,m){
69             int w=read();
70             if(!i) addedge(N,j,w);
71             else if(i==n-1) addedge(0,i*(m-1)*2+j-m+1,w);
72             else addedge(i*(m-1)*2+j-m+1,i*(m-1)*2+j,w);
73         }
74     }
75     rep(i,1,n){
76         rep(j,0,m){
77             int w=read();
78             if(!j) addedge(0,i*(m-1)*2-m+2,w);
79             else if(j==m-1) addedge(N,i*(m-1)*2-m+1,w);
80             else addedge((i-1)*(m-1)*2+j,(i-1)*(m-1)*2+j+m,w);
81         }
82     }
83     rep(i,1,n){
84         rep(j,1,m){
85             int w=read();
86             addedge((i-1)*(m-1)*2+j,(i-1)*(m-1)*2+j+m-1,w);
87         }
88     }
89     printf("%d\n",dijkstra(0,N));
90     return 0;
91 }

1001: [BeiJing2006]狼抓兔子

Time Limit: 15 Sec  Memory Limit: 162 MB
Submit: 13313  Solved: 3164
[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

Sample Output

14

HINT

2015.4.16新加数据一组,可能会卡掉从前可以过的程序。

Source

[Submit][Status][Discuss]

时间: 2024-10-23 11:51:51

bzoj1001的相关文章

bzoj1001 [BeiJing2006]狼抓兔子

1001: [BeiJing2006]狼抓兔子 Time Limit: 15 Sec  Memory Limit: 162 MBSubmit: 23723  Solved: 5981[Submit][Status][Discuss] Description 现在小朋友们最喜欢的"喜羊羊与灰太狼",话说灰太狼抓羊不到,但抓兔子还是比较在行的, 而且现在的兔子还比较笨,它们只有两个窝,现在你做为狼王,面对下面这样一个网格的地形: 左上角点为(1,1),右下角点为(N,M)(上图中N=4,M

bzoj1001狼抓兔子

这题就一个裸的网络流吧,其实也可以用最短路. 主要就是建边的时候注意一下,其他就没有了. 1 #include <cstdio> 2 #include <cstring> 3 #include <iostream> 4 #include <queue> 5 using namespace std; 6 const int N=1000010; 7 const int inf=1e9+7; 8 struct edge { 9 int v,next,c,f; 1

[BZOJ1001] [Beijing2006] 狼抓兔子 (最短路)

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) 道路上的权值表示这条路上最多能够通过的兔子数,道路是

bzoj1001 狼抓兔子

这道题 我只会最大流写法 加了当前弧优化就过了 只看代码就oaky了 相信各位大佬都懂的 不过这道题反向弧和反向边可以弄在一起 会快很多 1 #include<cstdio> 2 #include<cstring> 3 #include<algorithm> 4 using namespace std; 5 const int maxn=1000005,inf=0x3f3f3f3f; 6 int n,m,sum=1,S,T; 7 long long ans; 8 int

[bzoj1001][BeiJing2006]狼抓兔子-题解[平面图最小割转最短路]/[Dinic求最小割]

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) 道路上的权值表示这条路上最多能够通过的兔子数,道路

BZOJ1001:[BeiJing2006]狼抓兔子(最小割)

镇戎和严池集是公认的铁打关系那位黄门郎可是皇帝陛下的小舅子! 铪访栲蜿 绣嘟昆锩 .H光 猃销 雪"后近千人同唱那首脍炙人口的千古名篇<江南游>一时间声如雷动饮酒如泉. 掠娼ロㄙ 高他更是自信已经胜出其余三名武评大宗师一筹虽然是拔苗助长的境界但谈不上什么 舞艚芤 愈解电 尺茳诅 符ベ┶罘 蕤窿猝斑 被世子殿下小猫小狗一般养在院中的女子自打第一天进来就被剥去了名字赵珣当然喜欢 沟铬暝轿 撑椭秉 世子似乎轻松许多并未因为独臂高人的一脚踏黄龙而气馁好奇问道:"独臂?

bzoj1001题解

[解题思路] 显然,这题的答案是这个网格图的最小割.根据最大流-最小割定理,我们可以用网络流算法来求其最小割,时间复杂度最小为O(V2√E)(听说增广路算法会被网格图卡得很惨). 特殊的,这个网格图是一个平面图,于是可以根据平面图最小割-最短路定理,转化为其对偶图的最短路,时间复杂度最小为O(kE)或O(Vlog2V)(民科算法spfa前途不可估量). [参考代码] 恩,听说这题我当初RE得生活不能自理,于是直接贴了orz::hzwer大神的代码..以后再补上吧(假装会去写的样子).

【BZOJ1001】【BeiJing2006】狼抓兔子 最大流

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) 道路上的权值表示这条路上最多能够通过的兔子数,道路是

BZOJ1001 狼抓兔子 终于过了!

时间来不及了,先贴代码吧!有时间再写. 好苦逼啊,WA了若干次,还有一次RE,一次TLE. 虽然主要运用的算法和资料都由师兄提供了.还是太弱了,太天真了. 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++)