Description

最近《绝地求生:大逃杀》风靡全球,皮皮和毛毛也迷上了这款游戏,他们经常组队玩这款游戏。在游戏中,皮皮
和毛毛最喜欢做的事情就是堵桥,每每有一个好时机都能收到不少的快递。当然,有些时候并不能堵桥,皮皮和毛
毛会选择在其他的必经之路上蹲点。K博士作为一个老年人,外加有心脏病,自然是不能玩这款游戏的,但是这并
不能妨碍他对这款游戏进行一些理论分析,比如最近他就对皮皮和毛毛的战士很感兴趣。【题目描述】游戏的地图
可以抽象为一张n个点m条无向边的图,节点编号为1到n,每条边具有一个正整数的长度。假定大魔王都会从S点出
发到达T点(S和T已知),并且只会走最短路,皮皮和毛毛会在A点和B点埋伏大魔王。
为了保证一定能埋伏到大魔王,同时又想留大魔王一条生路,皮皮和毛毛约定A点和B点必须满足:
1.大魔王所有可能路径中,必定会经过A点和B点中的任意一点
2.大魔王所有可能路径中,不存在一条路径同时经过A点和B点
K博士想知道,满足上面两个条件的A,B点对有多少个,交换A,B的顺序算相同的方案

Input

第一行输入四个整数n,m,S,T(1≤n≤5×10^4,1≤m≤5×10^4,1≤S,T≤n),含义见题目描述。
接下来输入m行,每行输入三个整数u,v,w(1≤u,v≤n,1≤w≤10^9)表示存在一条长度为w的边链接u和v。
1≤n≤5×10^4,1≤m≤5×10^4,1≤w≤10^9

Output

输出一行表示答案

求出S-T最短路图,以及传递闭包

任选一个以T为根的树形图,对每条非树边u->v,选一个随机数x,将v的父亲和u分别到根的路径异或上x

若S和T不联通,任选两个点

否则,可以选两个点,使得其中一个点不在最短路图上,另一个点为最短路图上点权为0的点,或者选最短路图上两个互不能到达且权值相同且非零的点

#include<bits/stdc++.h>
typedef long long i64;
typedef unsigned long long u64;
typedef unsigned int u32;
const int N=5e4+;
char ib[N*],*ip=ib;
int _(){int x;scanf("%d",&x);return x;}
int n,m,S,T,e0[N],ep=;
i64 l[N],ans=;
struct edge{
int to,v,nx;
}e[N*];
struct node{
int w;
i64 l;
bool operator<(const node&w)const{return l>w.l;}
};
std::priority_queue<node>q;
bool ed[N];
struct pos{
int w;
u64 v,l;
bool operator<(const pos&x)const{return v!=x.v?v<x.v:l>x.l;}
}ps[N];
u64 f[N];
int fa[N],pp=,cp=;
u32 su[N][N/+];
void f1(int w){
ed[w]=;
for(int i=e0[w];i;i=e[i].nx){
int u=e[i].to;
if(l[u]+e[i].v==l[w]){
if(!ed[u])fa[u]=w,f1(u);
else{
u64 z=rand();
z=z<<^rand();
f[w]^=z;
f[fa[u]]^=z;
}
}
}
}
int _get(u32*a,int x){return a[x>>]>>x&;}
void _set(u32*a,int x){a[x>>]|=<<x;}
void _or(u32*a,u32*b){
int p=n/+;
for(int i=;i<p;i+=){
a[i]|=b[i];
a[i+]|=b[i+];
a[i+]|=b[i+];
a[i+]|=b[i+];
}
}
void f2(int w){
_set(su[w],w);
ed[w]=;
for(int i=e0[w];i;i=e[i].nx){
int u=e[i].to;
if(l[u]+e[i].v==l[w]){
if(ed[u])f2(u),f[w]^=f[u];
_or(su[w],su[u]);
}
}
if(f[w])ps[pp++]=(pos){w,f[w],l[w]};
else ++cp;
}
void cal(){
f1(T);
f2(T);
std::sort(ps,ps+pp);
for(int i=,j=;i<pp;i=j){
int t=;
for(++j;j<pp&&ps[i].v==ps[j].v;++j)t+=_get(su[ps[i].w],ps[j].w);
ans+=i64(j-i-t)*t;
}
ans+=cp*i64(n-cp-pp);
printf("%lld\n",ans);
}
int main(){
n=_();m=_();S=_();T=_();
srand(n^m^S^T^);
for(int i=;i<m;++i){
int a=_(),b=_(),c=_();
e[ep]=(edge){b,c,e0[a]};e0[a]=ep++;
e[ep]=(edge){a,c,e0[b]};e0[b]=ep++;
}
for(int i=;i<=n;++i)l[i]=1ll<<;
q.push((node){S,l[S]=});
while(q.size()){
node w=q.top();q.pop();
if(w.l!=l[w.w])continue;
if(w.w==T)return cal(),;
for(int i=e0[w.w];i;i=e[i].nx){
int u=e[i].to;
if(l[u]>w.l+e[i].v)q.push((node){u,l[u]=w.l+e[i].v});
}
}
printf("%lld\n",n*i64(n-)/);
return ;
}

bzoj5109: [CodePlus 2017]大吉大利,晚上吃鸡!的更多相关文章

  1. BZOJ5109 CodePlus 2017大吉大利,晚上吃鸡!(最短路+拓扑排序+bitset)

    首先跑正反两遍dij求由起点/终点到某点的最短路条数,这样条件一就转化为f(S,A)*f(T,A)+f(S,B)*f(T,B)=f(S,T).同时建出最短路DAG,这样图中任何一条S到T的路径都是最短 ...

  2. 【BZOJ5109】[CodePlus 2017]大吉大利,晚上吃鸡! 最短路+拓扑排序+DP

    [BZOJ5109][CodePlus 2017]大吉大利,晚上吃鸡! Description 最近<绝地求生:大逃杀>风靡全球,皮皮和毛毛也迷上了这款游戏,他们经常组队玩这款游戏.在游戏 ...

  3. [BZOJ5109]大吉大利,晚上吃鸡!

    [BZOJ5109]大吉大利,晚上吃鸡! 题目大意: 一张\(n(n\le5\times10^4)\)个点\(m(m\le5\times10^4)\)条边的无向图,节点编号为\(1\)到\(n\),边 ...

  4. GMA Round 1 大吉大利,晚上吃鸡

    传送门 大吉大利,晚上吃鸡 新年走亲访友能干点啥呢,咱开黑吃鸡吧. 这里有32个人,每个人都可能想玩或者不想玩,这样子一共有$2^{32}$种可能.而要开黑当然得4人4人组一队(四人模式),所以说如果 ...

  5. 「CodePlus 2017 11 月赛」大吉大利,晚上吃鸡!(dij+bitset)

    从S出发跑dij,从T出发跑dij,顺便最短路计数. 令$F(x)$为$S$到$T$最短路经过$x$的方案数,显然这个是可以用$S$到$x$的方案数乘$T$到$x$的方案数来得到. 然后第一个条件就变 ...

  6. 「CodePlus 2017 11 月赛」大吉大利,晚上吃鸡!

    n<=50000,m<=50000的图,给s和t,问有多少点对$(a,b)$满足 嗯. 不会. 首先最短路DAG造出来,然后两个条件转述一下:条件一,$N_a$表示从s到t经过a的路径,$ ...

  7. LOJ6252. 「CodePlus 2017 11 月赛」大吉大利,晚上吃鸡! 最短路+bitset

    题目传送门 https://loj.ac/problem/6252 https://lydsy.com/JudgeOnline/problem.php?id=5109 题解 首先跑最短路,只保留 \( ...

  8. [BZOJ5109/CodePlus2017]大吉大利,晚上吃鸡!

    Description 最近<绝地求生:大逃杀>风靡全球,皮皮和毛毛也迷上了这款游戏,他们经常组队玩这款游戏.在游戏中,皮皮和毛毛最喜欢做的事情就是堵桥,每每有一个好时机都能收到不少的快递 ...

  9. [Code+#1]大吉大利,晚上吃鸡!

    输入输出样例 输入样例#1: 7 7 1 7 1 2 2 2 4 2 4 6 2 6 7 2 1 3 2 3 5 4 5 7 2 输出样例#1: 6 输入样例#2: 5 5 1 4 1 2 1 1 3 ...

随机推荐

  1. 神州数码标准访问控制列表配置(ACL)

    实验要求:熟练掌握标准访问控制列表配置方法 拓扑如下 R1 enable 进入特权模式 config 进入全局模式 hostname R1 修改名称 interface s0/1 进入端口 ip ad ...

  2. java同步和互斥【用具体程序说明】

    java同步和互斥[用具体程序说明]            所有对象都自动含有单一的锁,也就是所有对象都有且只有唯一的锁,所以当某个任务(线程)访问一个类A中含有sycnhronized的方法是,那么 ...

  3. Visual C++ 6.0中if..else..的简单用法和基本格式

    # include <stdio.h> int main (void) { float score; printf("请输入您的考试成绩:"); scanf(" ...

  4. Vue原理--双向数据绑定

    MVVM MVVM 是Model-View-ViewModel 的缩写,它是一种基于前端开发的架构模式,其核心是提供对View 和 ViewModel 的双向数据绑定,这使得ViewModel 的状态 ...

  5. 记一次H5页面卡死的BUG

    之前有次开发小程序内嵌页面,类似于网易星球那种,很多钻石可以手动点击收取. 该页面css动效非常多,几乎页面上除了纯色背景之外全部有动效. 也正因为如此,才做成了小程序内嵌的形式(太大了). 当多次快 ...

  6. 原来你是这样的setTimeout

    先上代码 console.log("start"); setTimeout(function(){ console.log("Hello"); },200); ...

  7. day11.2lambda函数表达式 及其返回值注意事项

    lambda表达式 用于表示简单的函数 func1=lambda 参数:一句话函数体(默认返回函数体内执行的内容) 1.1结构 func=lambda a1,a2 : a1+100 val=func( ...

  8. MySQL_DML语言

    #MySQL--DML语言##SQL组成DDL:数据库模式定义语言,关键字:create DML:数据操纵语言,关键字:insert,delete,update DCL:数据库控制语言,关键字:gra ...

  9. SSH配置

    什么是SSH: SSH 为 Secure Shell 的缩写,由 IETF 的网络工作小组(Network Working Group)所制定:SSH 为建立在应用层和传输层基础上的安全协议.SSH ...

  10. 【OO学习】OO第二单元作业总结

    OO第二单元作业总结 在第二单元作业中,我们通过多线程的手段实现了电梯调度,前两次作业是单电梯调度,第三次作业是多电梯调度.这个单元中的性能分要求是完成所有请求的时间最短,因此在简单实现电梯调度的基础 ...