首先跑正反两遍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==10||c==13||c==32) c=getchar();return c;}
int gcd(int n,int m){return m==0?n:gcd(m,n%m);}
int read()
{int x=0,f=1;char c=getchar();while (c<'0'||c>'9') {if (c=='-') f=-1;c=getchar();}while (c>='0'&&c<='9') x=(x<<1)+(x<<3)+(c^48),c=getchar();return x*f;
}
int n,m,S,T,t,p[N],f[2][N],g[N];
ll d[2][N];
bool flag[N];
struct data{int to,nxt,len;
}edge[N<<1];
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],42,sizeof(d[op]));d[op][S]=0;f[op][S]=1;memset(flag,0,sizeof(flag));while (!q.empty()) q.pop();q.push((data2){S,0});for (;;){while (!q.empty()&&flag[q.top().x]) q.pop();if (q.empty()) break;data2 x=q.top();q.pop();flag[x.x]=1;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]=0;}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]={0},q[N]={0},degree[N]={0},t=0;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=1;i<=t;i++) degree[edge[i].to]++;int head=0,tail=0;for (int i=1;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=0;for (int i=1;i<=n;i++){int x=q[i];from[x][x]=1;for (int j=p[x];j;j=edge[j].nxt)from[edge[j].to]|=from[x];}for (int i=n;i>=1;i--){int x=q[i];to[x][x]=1;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>>1);}
}
int main()
{
#ifndef ONLINE_JUDGEfreopen("bzoj5109.in","r",stdin);freopen("bzoj5109.out","w",stdout);const char LL[]="%I64d\n";
#elseconst char LL[]="%lld\n";
#endifn=read(),m=read(),S=read(),T=read();for (int i=1;i<=m;i++){int x=read(),y=read(),z=read();addedge(x,y,z),addedge(y,x,z);}dijkstra(S,0),dijkstra(T,1);if (f[0][T]==0) {cout<<(1ll*n*(n-1)>>1);return 0;}for (int i=1;i<=n;i++){if (d[0][i]+d[1][i]==d[0][T]) g[i]=1ll*f[0][i]*f[1][i]%P;cnt[g[i]][i]=1;}for (int i=1;i<=t;i+=2){if (d[0][edge[i+1].to]+d[1][edge[i].to]+edge[i].len==d[0][T]) shortestpathDAG::addedge(edge[i+1].to,edge[i].to);if (d[0][edge[i].to]+d[1][edge[i+1].to]+edge[i].len==d[0][T]) shortestpathDAG::addedge(edge[i].to,edge[i+1].to);}shortestpathDAG::topsort();shortestpathDAG::work();return 0;
}

转载于:https://www.cnblogs.com/Gloid/p/9923644.html

BZOJ5109 CodePlus 2017大吉大利,晚上吃鸡!(最短路+拓扑排序+bitset)相关推荐

  1. HTML5+css+JS实现页面打枪声音特效减压玩法 PUBG 大吉大利 今晚吃鸡

    HTML5+css+JS实现页面打枪声音特效减压玩法 PUBG 大吉大利 今晚吃鸡 css部分 *{margin: 0;padding:0;}body{min-height:100vh;overflo ...

  2. 老司机带你在MySQL领域“大吉大利,晚上吃鸡”

    关注↑↑↑我们获得更多精彩内容! 作者 | 张甦, 数据库领域的专家和知名人士.图书<MySQL王者晋级之路>作者,51CTO 专家博主.近10年互联网线上处理及培训经验,专注于 MySQ ...

  3. 大吉大利-今晚吃鸡-枪械

    题目描述 在绝地求生(吃鸡)游戏里,不同的枪支有不同的威力,更是可以搭配不同的配件,以提升枪支的性能. 每一把枪都有其威力及其可装备配件种类.每一个配件有其所属种类,可以为枪支提供威力的百分比加成.每 ...

  4. 大吉大利-今晚吃鸡-跑毒

    题目描述 现在有一款很火的游戏playerunknown's battlegrounds,人称"吃鸡",在里面经常面临跑毒(从安全区外跑进安全区内)的问题,在安全区外,人们会处于中 ...

  5. 大吉大利 今晚吃鸡之跑毒篇

    现在有一款很火的游戏playerunknown's battlegrounds,人称"吃鸡",在里面经常面临跑毒(从安全区外跑进安全区内)的问题,在安全区外,人们会处于中毒状态,每 ...

  6. 大吉大利今晚吃鸡——枪械篇

    题目链接:点击打开链接 这题难点带就是输入?我是因为用float精度不够才不过的,改成double就ok了 #include <cstdio> using namespace std;in ...

  7. 大吉大利今晚吃鸡——跑毒篇

    题目链接:点击打开链接 问题 1. 边界部分恰好擦着的时候到底是死是活.......写到程序里就是有没有=的问题. 首先题目里明确指出打包的时候擦着就是死. 然后后面有个带着你理解第二个样例的部分,这 ...

  8. 计算机内存不足吃鸡怎么办,Win10玩吃鸡游戏提示虚拟内存不足怎么办?

    Win10玩吃鸡游戏提示"虚拟内存不足"怎么办? 最近吃鸡游戏非常火,大家都想大吉大利晚上吃鸡!因为吃鸡游戏对电脑配置的要求非常高,所以很多用户在玩吃鸡手游时会遇到各种问题,最常见 ...

  9. 吃鸡一直显示服务器,吃鸡一直显示服务器未连接 | 手游网游页游攻略大全

    发布时间:2017-05-12 怎么吃鸡?相信很多新手玩家在经过几十甚至上百小时的游戏洗礼之后,心中对于吃鸡的疑惑也是越来越大,为什么有时候明明开局不顺却最后吃鸡,而有时候明明很肥却送了快递.所以今天 ...

  10. 为什么吃鸡显示连接不到服务器,为什么吃鸡进游戏显示连接不上 | 手游网游页游攻略大全...

    发布时间:2015-09-28 原因:显卡太老,不支持DX9.0c+SM3.0 解决方法:换新显卡 标签: 发布时间:2017-05-12 怎么吃鸡?相信很多新手玩家在经过几十甚至上百小时的游戏洗礼之 ...

最新文章

  1. 深聪智能朱澄宇:自研 AI 芯片不是赶时髦 | CCF-GAIR 2019
  2. DL之MobileNetV2:MobileNetV2算法的简介(论文介绍)、架构详解、案例应用等配图集合之详细攻略
  3. WebService 与 DCOM / Corba 是什么关系?
  4. STM32L152RC 在keil4中使用printf()和scanf() 函数
  5. 阿里云加入 OCI,共建容器开放标准
  6. sqlserver数据库创建表
  7. boost::hana::map_用法的测试程序
  8. nacos 公共_SpringCloud配合注册中心Nacos的使用
  9. linux系统ftp优化,Linux vsftp 部署优化
  10. 软件机器人从幕后到台前 RPA+Chatbot带来“端到端的自动化”
  11. r语言聚类分析_R语言实现tSNE聚类分析
  12. Vensim系统建模论文阅读-Information diffusion through social networks: The case of an online petition
  13. 终于找全了!质量总监、质量经理、计划主管..质量部27个岗位职责
  14. 如何升级iOS15,描述文件详细安装教程
  15. 添加遮罩css,添加遮罩层
  16. java获取钉钉登录信息,JAVA maven项目使用钉钉SDK获取token、用户
  17. 基于微信小程序社区疫情防控系统
  18. 安卓 11 非网络以太网切换动态和静态IP无法连接问题
  19. 刘轩:教你改善自己的生活习惯
  20. Linux 配置nginx和php代理 ip访问

热门文章

  1. 剑指 Offer II 075. 数组相对排序(中等 排序 数组)
  2. 第1讲(数据库软件的配置与游戏数据库的搭建)
  3. 我的知识网络结构图(2019)
  4. android e.printStackTrace()异常处理
  5. 外显子分析思路总结(Exome Sequencing Analysis review)
  6. leetcode-SQL-1148. 文章浏览 I
  7. win10 纯净版系统如何添加字体的方法
  8. The server encountered an internal error that prevented it from fulfilling this request.
  9. 教师资格证面试缴费找不到服务器,2016年教师资格证考试报名网上缴费常见问题...
  10. 软件质量的定义及其六大特性(质量模型)