bzoj 4242 水壶 (多源最短路+最小生成树+启发式合并)
4242: 水壶
Time Limit: 50 Sec Memory Limit: 512 MB
Submit: 1028 Solved: 261
[Submit][Status][Discuss]
Description
Input
Output
Sample Input
.....
..##.
.#...
..#..
.....
1 1
4 2
3 3
2 5
1 2
2 4
1 3
3 4
Sample Output
4
4
2
HINT
跟bzoj4144题一样。。不过由于每条边距离相等,所以我们要把优先队列换成普通队列来减少时间。我实在是口算不出来这个时间是多少,然后一开始优先队列一直过不了。看了人家ac代码是普通队列一改就过了。。。orz。不过时间也是挺极限的46s。反正过啦!
- #include<bits/stdc++.h>
- #define clr(x) memset(x,0,sizeof(x))
- #define clr_1(x) memset(x,-1,sizeof(x))
- #define INF 0x3f3f3f3f
- #define LL long long
- #define pb push_back
- #define mod 1000000007
- #define ls(i) (i<<1)
- #define rs(i) (i<<1|1)
- #define mp make_pair
- #define fi first
- #define se second
- using namespace std;
- const int N=2e3+;
- const int M=2e5+;
- typedef pair<int,int> pii;
- typedef pair<LL,pii> plii;
- queue<pii> que;
- int mart[N][N];
- char s[N];
- LL dis[N][N];
- int pre[N][N];
- bool vis[N][N];
- struct edge
- {
- int u,v;
- LL w;
- edge(int _u,int _v,LL _w):u(_u),v(_v),w(_w) {}
- };
- vector<edge> e;
- int dirx[]={,,,-},diry[]={,-,,};
- void dij(int n,int m)
- {
- while(!que.empty())
- {
- pii p=que.front();
- que.pop();
- int x=p.fi;
- int y=p.se;
- LL d=dis[x][y];
- if(vis[x][y]) continue;
- vis[x][y]=;
- for(int i=;i<;i++)
- {
- int a=x+dirx[i];
- int b=y+diry[i];
- if(mart[a][b]) continue;
- if(!pre[a][b] || dis[a][b]>d+)
- {
- dis[a][b]=d+;
- pre[a][b]=pre[x][y];
- que.push(mp(a,b));
- }
- else if(pre[a][b]!=pre[x][y])
- e.pb(edge(pre[a][b],pre[x][y],dis[x][y]+dis[a][b]));
- }
- }
- }
- int fa[M],rfa[M];
- int rk[M],dep[M];
- LL up[M];
- bool cmp(edge a,edge b) {return a.w<b.w;}
- int Find(int u) { return fa[u]==u?u:fa[u]=Find(fa[u]);}
- void Union(int n)
- {
- sort(e.begin(),e.end(),cmp);
- for(int i=;i<=n;i++)
- fa[i]=i,rk[i]=;
- int sz=e.size();
- for(int i=;i<sz;i++)
- {
- int x=e[i].u;
- int y=e[i].v;
- LL w=e[i].w;
- x=Find(x),y=Find(y);
- if(x==y) continue;
- if(rk[x]<rk[y]) swap(x,y);
- if(rk[x]==rk[y]) rk[x]++;
- fa[y]=x,rfa[y]=x,up[y]=w;
- }
- return ;
- }
- void dealdep(int u)
- {
- if(Find(u)==u)
- {
- dep[u]=;
- return ;
- }
- dealdep(rfa[u]);
- dep[u]=dep[rfa[u]]+;
- return ;
- }
- LL solve(int u,int v)
- {
- LL maxn=;
- if(Find(u)!=Find(v)) return -;
- if(dep[u]<dep[v]) swap(u,v);
- while(dep[u]>dep[v])
- {
- maxn=max(maxn,up[u]);
- u=rfa[u];
- }
- while(u!=v)
- {
- maxn=max(maxn,up[u]);
- maxn=max(maxn,up[v]);
- u=rfa[u],v=rfa[v];
- }
- return maxn;
- }
- int main()
- {
- int n,m,k,q;
- scanf("%d%d%d%d",&n,&m,&k,&q);
- for(int i=;i<=n;i++)
- {
- scanf("%s",s+);
- for(int j=;j<=m;j++)
- if(s[j]=='.') mart[i][j]=;
- else mart[i][j]=;
- }
- for(int i=;i<=m+;i++)
- mart[][i]=mart[n+][i]=;
- for(int i=;i<=n+;i++)
- mart[i][]=mart[i][m+]=;
- clr_1(dis);
- for(int i=;i<=k;i++)
- {
- int u,v;
- scanf("%d%d",&u,&v);
- dis[u][v]=;
- pre[u][v]=i;
- que.push(mp(u,v));
- }
- dij(n,m);
- Union(k);
- for(int i=;i<=k;i++)
- if(!dep[i]) dealdep(i);
- // for(int i=1;i<=k;i++)
- // cout<<"pos:"<<pt[i]/m+1<<" "<<pt[i]%m+1<<" blk:"<<Find(pt[i])/m+1<<" "<<Find(pt[i])%m+1<<" fa:"<<rfa[pt[i]]/m+1<<" "<<rfa[pt[i]]%m+1<<" dep:"<<dep[pt[i]]<<" val:"<<up[pt[i]]<<endl;
- while(q--)
- {
- int u,v;
- scanf("%d%d",&u,&v);
- printf("%lld\n",solve(u,v));
- }
- return ;
- }
bzoj 4242 水壶 (多源最短路+最小生成树+启发式合并)的更多相关文章
- 4144: [AMPPZ2014]Petrol (多源最短路+最小生成树+启发式合并)
4144: [AMPPZ2014]Petrol Time Limit: 10 Sec Memory Limit: 256 MBSubmit: 752 Solved: 298[Submit][Sta ...
- BZOJ 4242: 水壶 Kruskal+BFS
4242: 水壶 Time Limit: 40 Sec Memory Limit: 256 MBSubmit: 427 Solved: 112[Submit][Status][Discuss] D ...
- BZOJ 4242 水壶(BFS建图+最小生成树+树上倍增)
题意 JOI君所居住的IOI市以一年四季都十分炎热著称. IOI市是一个被分成纵H*横W块区域的长方形,每个区域都是建筑物.原野.墙壁之一.建筑物的区域有P个,编号为1...P. JOI君只能进入建筑 ...
- BZOJ 4242: 水壶(Kruskal重构树 + Bfs)
题意 一块 \(h ∗ w\) 的区域,存在障碍.空地.\(n\) 个建筑,从一个建筑到另一个建筑的花费为:路径上最长的连续空地的长度. \(q\) 次询问:从建筑 \(s_i\) 到 \(t_i\) ...
- BZOJ 1483:[HNOI2009]梦幻布丁(链表+启发式合并)
[HNOI2009]梦幻布丁 Description N个布丁摆成一行,进行M次操作.每次将某个颜色的布丁全部变成另一种颜色的,然后再询问当前一共有多少段颜色.例如颜色分别为1,2,2,1的四个布丁一 ...
- BZOJ 1483:[HNOI2009]梦幻布丁(链表启发式合并)
http://www.lydsy.com/JudgeOnline/problem.php?id=1483 题意:中文. 思路:对于每一种颜色,用一个链表串起来,一开始保存一个答案,后面颜色替换的时候再 ...
- Bzoj 2733: [HNOI2012]永无乡 数组Splay+启发式合并
2733: [HNOI2012]永无乡 Time Limit: 10 Sec Memory Limit: 128 MBSubmit: 3955 Solved: 2112[Submit][Statu ...
- Bzoj 2733: [HNOI2012]永无乡(线段树+启发式合并)
2733: [HNOI2012]永无乡 Time Limit: 10 Sec Memory Limit: 128 MB Description 永无乡包含 n 座岛,编号从 1 到 n,每座岛都有自己 ...
- 【BZOJ4144】[AMPPZ2014]Petrol(最短路+最小生成树+并查集)
Description 给定一个n个点.m条边的带权无向图,其中有s个点是加油站. 每辆车都有一个油量上限b,即每次行走距离不能超过b,但在加油站可以补满. q次询问,每次给出x,y,b,表示出发点是 ...
随机推荐
- AutoCAD DevTV-AUTOCAD二次开发资源合集
Webcast Language Date AutoCAD .Net - Session 2 English 13-Sep-12 AutoCAD .Net - Session 1 English 6- ...
- springCloud全实战超详细代码demo+笔记
码云: https://gitee.com/houzheng1216/springcloud
- laravel 中provider的理解和使用
https://segmentfault.com/q/1010000004640866
- Linux入门(二)Shell基本命令
上一篇讲了普通用户切换到root用户,今天补充一点,对于Debian和Ubuntu用户,安装时候只有一个普通用户注册,在需要root权限时,我们可以在普通用户模式下输入sudo这个命令运行某些相关特权 ...
- 洛谷P3088 挤奶牛
传送门啦 这个题也是一个单调队列来优化的 $ dp $ ,我们考虑这个题,这个题让我们求出有多少奶牛会觉得拥挤,如果我们还像琪露诺那个题那样单纯用一次单调队列肯定是不行的,因为牛觉不觉得拥挤是受左右的 ...
- who am i ?
Id:Ox9A82 Email:hucvbty@gmail.com 微博:http://weibo.com/1828621423 知乎:Ox9A82 常乐村男子职业技术学院 Syclover拖后腿成员 ...
- C#基础之数据类型
c#有15个预定义类型,其中13个是值类型,两个是引用类型(string 和 object) 1.整型 2.浮点类型 float数据类型用于较小的浮点数,因为它要求的精度较低. double数据类型比 ...
- Zabbix监控websphere和weblogic
本节内容 zabbix java gateway 配置和运行java gateway 配置zabbix server使用java gateway 调整java gateway的日志级别 监控weblo ...
- 《精通Python设计模式》学习结构型之代理模式
这种模式,总会让人想到SRPING中的AOP, 不同语言有不同的实现方式吧. class SensitiveInfo: def __init__(self): self.users = ['nick' ...
- CentOS7多实例安装mysq5.6二进制版本
1丶下载mysql,解压,创建用户,创建软链接 test -d /tools || mkdir /tools ;cd /tools wget http://mirrors.sohu.com/mysql ...