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
输出一行表示答案

Sample Input
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

Sample Output
6


首先预祝你们落地成盒(逃

话说大家喜欢用些什么枪啊,步枪还是狙击枪(ヽ( ̄︿ ̄ )—C<(/°Д°)/,又不好好讲题了,拖走

咳,我们还是回到正题,首先我们简化一下题面:若存在点对\((x,y)\),满足所有S到T的最短路,存在任意一条经过且只经过一个点,且所有最短路不会同时经过两个点,那么这个点对就是合法的,求合法点对的个数

首先我们求出所有S到T的最短路,将其作为一张新图,并统计新图内的点数,首先利用乘法原理,一个点在最短路上,一个点不在,求出一部分答案。

然后考虑新图内的答案,我们在选定一个点之后,该点向T方向走能到达的所有点都是不可选的,同理,所有从S方向能走到它的点也是不可选的。如何记录这些点?Hash或bitset。然后由于会算重,我们除2即可

注意,如果S->T不连通,我们需要输出\(\binom{n}{2}\)

/*program from Wolfycz*/
#include<cmath>
#include<cstdio>
#include<bitset>
#include<cstring>
#include<iostream>
#include<algorithm>
#define inf 1e18
using namespace std;
typedef long long ll;
typedef unsigned int ui;
typedef unsigned long long ull;
inline int read(){int x=0,f=1;char ch=getchar();for (;ch<'0'||ch>'9';ch=getchar())  if (ch=='-')    f=-1;for (;ch>='0'&&ch<='9';ch=getchar())    x=(x<<1)+(x<<3)+ch-'0';return x*f;
}
inline void print(int x){if (x>=10)  print(x/10);putchar(x%10+'0');
}
const int N=5e4;
int pre[(N<<1)+10],now[N+10],child[(N<<1)+10],val[(N<<1)+10];
int tot;
ll Ans,Low_Dis;
struct S1{ll dis[N+10];S1(){memset(dis,63,sizeof(dis));}
}Frw,Bck;
int h[N+10],f[N+10];
bool vis[N+10],In[N+10];
void join(int x,int y,int z){pre[++tot]=now[x],now[x]=tot,child[tot]=y,val[tot]=z;}
void insert(int x,int y,int z){join(x,y,z),join(y,x,z);}
void SPFA(int x,ll *dis){int head=0,tail=1;h[1]=x,dis[x]=0,vis[x]=1;while (head!=tail){if (++head>N)   head=1;int Now=h[head];for (int p=now[Now],son=child[p];p;p=pre[p],son=child[p]){if (dis[son]>dis[Now]+val[p]){dis[son]=dis[Now]+val[p];if (!vis[son]){if (++tail>N)   tail=1;vis[h[tail]=son]=1;}}}vis[Now]=0;}
}
bitset<N>bit[N+10],tmp(1);
void dfs_S(int x,int fa,int T){bit[x]|=tmp<<(x-1);if (x==T)   return;for (int p=now[x],son=child[p];p;p=pre[p],son=child[p]){if (son==fa||Frw.dis[x]+val[p]+Bck.dis[son]!=Low_Dis)   continue;dfs_S(son,x,T);bit[x]|=bit[son];}
}
void dfs_T(int x,int fa,int T){bit[x]|=tmp<<(x-1);if (x==T)   return;for (int p=now[x],son=child[p];p;p=pre[p],son=child[p]){if (son==fa||Bck.dis[x]+val[p]+Frw.dis[son]!=Low_Dis)   continue;dfs_T(son,x,T);bit[x]|=bit[son];}
}
int main(){int n=read(),m=read(),S=read(),T=read(),All=0;for (int i=1;i<=m;i++){int x=read(),y=read(),z=read();insert(x,y,z);}SPFA(S,Frw.dis);SPFA(T,Bck.dis);Low_Dis=Frw.dis[T];for (int i=1;i<=n;i++)  if (Frw.dis[i]+Bck.dis[i]==Low_Dis) In[i]=1,All++;if (Low_Dis>inf){printf("%lld\n",1ll*n*(n-1)/2);return 0;}dfs_S(S,0,T);for (int i=1;i<=n;i++)  if (In[i])  f[i]+=bit[i].count(),bit[i].reset();dfs_T(T,0,S);for (int i=1;i<=n;i++)  if (In[i])  f[i]+=bit[i].count()-1;Ans=1ll*All*(n-All);ll res=0;for (int i=1;i<=n;i++)  if (In[i])  res+=All-f[i];printf("%lld\n",Ans+(res>>1));return 0;
}

转载于:https://www.cnblogs.com/Wolfycz/p/9744383.html

[BZOJ5109/CodePlus2017]大吉大利,晚上吃鸡!相关推荐

  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. Android短消息备份闪退,Android Socket发送信息时闪退
  2. 建立你的RoR学习环境(Windows)之一
  3. 【算法】算法 二分查找 二分查找 查找多个相同的值
  4. 错误 C2628 “Wall”后面接“int”是非法的(是否忘记了“;”?)
  5. Linux多线程工作笔记0005---Linux多线程基础_创建线程pthread_create_线程等待_线程终止
  6. java工作笔记019---java8新特性判断非null
  7. IDEA导入Gradle项目后,重现构建项目并导入jar包后但是External Libraries目录中无任何引入的jar包
  8. DoIP诊断技术一点通
  9. 数据库管理系统的基本组成
  10. Nvidia Graphics Card Drive Download 英伟达显卡驱动花屏问题解决处理方式
  11. Android手机屏幕的三种状态
  12. 三菱PLC中通过变址寄存器V或Z实现简单跑马灯的程序示例及说明
  13. 如何将苹果手机中的M4A音乐转换为MP3格式 1
  14. 【小程序】使用wxParse解析html
  15. 关于出现 linux Table is marked as crashed and should be repaired
  16. vscode 开发 Java web 急速教程
  17. 新媒体运营都包括哪些方面
  18. poi word 表格设置居中、左对齐缩进、边框、字体
  19. 管理系统中计算机应用自考本科,重庆自考管理系统中计算机应用本科模拟试题 _ 重庆自考网...
  20. 新郑计算机培训机构排名前十,新郑美术培训中心排名

热门文章

  1. 云计算技术 - 基础环境搭建
  2. 傻子都能看懂的 财务报表入门
  3. mysql 50个经典语句_MYSQL经典语句大全——开发篇
  4. 快手用计算机弹奏,【图片】【CJ他家】弹计算器视频传送门、计算器谱等随时更新!_计算器音乐吧_百度贴吧...
  5. [linux]scp与服务器互传文件
  6. bootstrap案例解析
  7. Windows Print Spooler远程代码执行漏洞复现(CVE-2021-1675)
  8. MySQL数据库getdate_MySQL数据库 DateTime 默认值是不是用getdate
  9. FTPserver 配置
  10. 第一博客,行走在编程道路上的菜鸟