BZOJ5109 CodePlus 2017大吉大利,晚上吃鸡!(最短路+拓扑排序+bitset)
首先跑正反两遍dij求由起点/终点到某点的最短路条数,这样条件一就转化为f(S,A)*f(T,A)+f(S,B)*f(T,B)=f(S,T)。同时建出最短路DAG,这样图中任何一条S到T的路径都是最短路径,对于条件二就只需要判断A是否能走到B。注意到空间开的非常大。那么对于条件二的可达性显然是可以bitset优化的。对于条件一可以map套bitset。两者and再count一下就可以了。bzoj的空间限制开小了于是这种做法就直接MLE了。
- #include<iostream>
- #include<cstdio>
- #include<cmath>
- #include<cstdlib>
- #include<cstring>
- #include<algorithm>
- #include<queue>
- #include<map>
- #include<bitset>
- using namespace std;
- #define ll long long
- #define N 50010
- #define P 1000000007
- char getc(){char c=getchar();while (c==||c==||c==) c=getchar();return c;}
- int gcd(int n,int m){return m==?n:gcd(m,n%m);}
- int read()
- {
- int x=,f=;char c=getchar();
- while (c<''||c>'') {if (c=='-') f=-;c=getchar();}
- while (c>=''&&c<='') x=(x<<)+(x<<)+(c^),c=getchar();
- return x*f;
- }
- int n,m,S,T,t,p[N],f[][N],g[N];
- ll d[][N];
- bool flag[N];
- struct data{int to,nxt,len;
- }edge[N<<];
- struct data2
- {
- int x;ll d;
- bool operator <(const data2&a) const
- {
- return d>a.d;
- }
- };
- priority_queue<data2> q;
- bitset<N> to[N],from[N];
- map<int,bitset<N> > cnt;
- void addedge(int x,int y,int z){t++;edge[t].to=y,edge[t].nxt=p[x],edge[t].len=z,p[x]=t;}
- void inc(int &x,int y){x+=y;if (x>=P) x-=P;}
- void dijkstra(int S,int op)
- {
- memset(d[op],,sizeof(d[op]));d[op][S]=;f[op][S]=;
- memset(flag,,sizeof(flag));
- while (!q.empty()) q.pop();
- q.push((data2){S,});
- for (;;)
- {
- while (!q.empty()&&flag[q.top().x]) q.pop();
- if (q.empty()) break;
- data2 x=q.top();q.pop();
- flag[x.x]=;
- for (int i=p[x.x];i;i=edge[i].nxt)
- {
- if (x.d+edge[i].len<d[op][edge[i].to])
- {
- d[op][edge[i].to]=x.d+edge[i].len;
- q.push((data2){edge[i].to,d[op][edge[i].to]});
- f[op][edge[i].to]=;
- }
- if (x.d+edge[i].len==d[op][edge[i].to])
- inc(f[op][edge[i].to],f[op][x.x]);
- }
- }
- }
- namespace shortestpathDAG
- {
- int p[N]={},q[N]={},degree[N]={},t=;
- struct data{int to,nxt;}edge[N];
- void addedge(int x,int y){t++;edge[t].to=y,edge[t].nxt=p[x],p[x]=t;}
- void topsort()
- {
- for (int i=;i<=t;i++) degree[edge[i].to]++;
- int head=,tail=;for (int i=;i<=n;i++) if (!degree[i]) q[++tail]=i;
- while (tail<n)
- {
- int x=q[++head];
- for (int i=p[x];i;i=edge[i].nxt)
- {
- degree[edge[i].to]--;
- if (!degree[edge[i].to]) q[++tail]=edge[i].to;
- }
- }
- }
- void work()
- {
- ll ans=;
- for (int i=;i<=n;i++)
- {
- int x=q[i];from[x][x]=;
- for (int j=p[x];j;j=edge[j].nxt)
- from[edge[j].to]|=from[x];
- }
- for (int i=n;i>=;i--)
- {
- int x=q[i];to[x][x]=;
- for (int j=p[x];j;j=edge[j].nxt)
- to[x]|=to[edge[j].to];
- ans+=((~(to[x]|from[x]))&cnt[(g[T]-g[x]+P)%P]).count();
- }
- cout<<(ans>>);
- }
- }
- int main()
- {
- #ifndef ONLINE_JUDGE
- freopen("bzoj5109.in","r",stdin);
- freopen("bzoj5109.out","w",stdout);
- const char LL[]="%I64d\n";
- #else
- const char LL[]="%lld\n";
- #endif
- n=read(),m=read(),S=read(),T=read();
- for (int i=;i<=m;i++)
- {
- int x=read(),y=read(),z=read();
- addedge(x,y,z),addedge(y,x,z);
- }
- dijkstra(S,),dijkstra(T,);
- if (f[][T]==) {cout<<(1ll*n*(n-)>>);return ;}
- for (int i=;i<=n;i++)
- {
- if (d[][i]+d[][i]==d[][T]) g[i]=1ll*f[][i]*f[][i]%P;
- cnt[g[i]][i]=;
- }
- for (int i=;i<=t;i+=)
- {
- if (d[][edge[i+].to]+d[][edge[i].to]+edge[i].len==d[][T]) shortestpathDAG::addedge(edge[i+].to,edge[i].to);
- if (d[][edge[i].to]+d[][edge[i+].to]+edge[i].len==d[][T]) shortestpathDAG::addedge(edge[i].to,edge[i+].to);
- }
- shortestpathDAG::topsort();
- shortestpathDAG::work();
- return ;
- }
BZOJ5109 CodePlus 2017大吉大利,晚上吃鸡!(最短路+拓扑排序+bitset)的更多相关文章
- bzoj5109: [CodePlus 2017]大吉大利,晚上吃鸡!
Description 最近<绝地求生:大逃杀>风靡全球,皮皮和毛毛也迷上了这款游戏,他们经常组队玩这款游戏.在游戏中,皮皮 和毛毛最喜欢做的事情就是堵桥,每每有一个好时机都能收到不少的快 ...
- 【BZOJ5109】[CodePlus 2017]大吉大利,晚上吃鸡! 最短路+拓扑排序+DP
[BZOJ5109][CodePlus 2017]大吉大利,晚上吃鸡! Description 最近<绝地求生:大逃杀>风靡全球,皮皮和毛毛也迷上了这款游戏,他们经常组队玩这款游戏.在游戏 ...
- [BZOJ5109][LOJ #6252][P4061][CodePlus 2017 11月赛]大吉大利,今晚吃鸡!(最短路+拓扑排序+传递闭包+map+bitset(hash+压位))
5109: [CodePlus 2017]大吉大利,晚上吃鸡! Time Limit: 30 Sec Memory Limit: 1024 MBSubmit: 107 Solved: 57[Sub ...
- [BZOJ5109]大吉大利,晚上吃鸡!
[BZOJ5109]大吉大利,晚上吃鸡! 题目大意: 一张\(n(n\le5\times10^4)\)个点\(m(m\le5\times10^4)\)条边的无向图,节点编号为\(1\)到\(n\),边 ...
- GMA Round 1 大吉大利,晚上吃鸡
传送门 大吉大利,晚上吃鸡 新年走亲访友能干点啥呢,咱开黑吃鸡吧. 这里有32个人,每个人都可能想玩或者不想玩,这样子一共有$2^{32}$种可能.而要开黑当然得4人4人组一队(四人模式),所以说如果 ...
- 「CodePlus 2017 11 月赛」大吉大利,晚上吃鸡!(dij+bitset)
从S出发跑dij,从T出发跑dij,顺便最短路计数. 令$F(x)$为$S$到$T$最短路经过$x$的方案数,显然这个是可以用$S$到$x$的方案数乘$T$到$x$的方案数来得到. 然后第一个条件就变 ...
- 「CodePlus 2017 11 月赛」大吉大利,晚上吃鸡!
n<=50000,m<=50000的图,给s和t,问有多少点对$(a,b)$满足 嗯. 不会. 首先最短路DAG造出来,然后两个条件转述一下:条件一,$N_a$表示从s到t经过a的路径,$ ...
- LOJ6252. 「CodePlus 2017 11 月赛」大吉大利,晚上吃鸡! 最短路+bitset
题目传送门 https://loj.ac/problem/6252 https://lydsy.com/JudgeOnline/problem.php?id=5109 题解 首先跑最短路,只保留 \( ...
- [BZOJ5109/CodePlus2017]大吉大利,晚上吃鸡!
Description 最近<绝地求生:大逃杀>风靡全球,皮皮和毛毛也迷上了这款游戏,他们经常组队玩这款游戏.在游戏中,皮皮和毛毛最喜欢做的事情就是堵桥,每每有一个好时机都能收到不少的快递 ...
随机推荐
- mysql帐号不允许从远程登陆
默认情况下,mysql帐号不允许从远程登陆,只能在localhost登录.本文提供了二种方法设置mysql可以通过远程主机进行连接. 一.改表法 在localhost登入mysql后,更改 “mysq ...
- Hadoop(25)-高可用集群配置,HDFS-HA和YARN-HA
一. HA概述 1. 所谓HA(High Available),即高可用(7*24小时不中断服务). 2. 实现高可用最关键的策略是消除单点故障.HA严格来说应该分成各个组件的HA机制:HDFS的HA ...
- Leecode刷题之旅-C语言/python-101对称二叉树
/* * @lc app=leetcode.cn id=101 lang=c * * [101] 对称二叉树 * * https://leetcode-cn.com/problems/symmetri ...
- Python3爬虫(十二) 爬虫性能
Infi-chu: http://www.cnblogs.com/Infi-chu/ 一.简单的循环串行一个一个循环,耗时是最长的,是所有的时间综合 import requests url_list ...
- 生产Web架构优化方案(动态转静态)
Infi-chu: http://www.cnblogs.com/Infi-chu/ 一.门户新闻业务: 1. 特点:网页一旦发布,再次改动网页内容的几率很低,新闻业务内容的静态化相对比较简单 2. ...
- 4364: [IOI2014]wall砖墙
4364: [IOI2014]wall砖墙 链接 分析: 线段树,维护一个最大值,一个最小值. 代码: #include<bits/stdc++.h> ],*p1 = buf,*p2 = ...
- html页面导出word文档
1.加入两个外部js 1)FileSaver.js /* FileSaver.js * A saveAs() FileSaver implementation. * 1.3.2 * 2016-06-1 ...
- CentOS7安装Oracle 11gR2 图文详解
注:Oracle11gR2 X64安装 一.环境准备 安装包: 1.VMware-workstation-full-11.1.0-2496824.exe 2.CentOS-7-x86_64-DVD-1 ...
- EF使用报错说缺少引用
在程序中已经引用了EF,也引用了System.Data,但是一起报这个错误: 在类前面也已经写了 using System.Data.Entity,百思不得其解,最后才发 ...
- 获得通讯录并拨打电话 Android
由于通讯录在手机里是以数据库贮存的 所以我们可以通过getContentResolver来获得通讯录 ,这个方法返回一个游标的数据类型,通过moveToNext()方法来获取所有的手机号码信息, 当然 ...