我的参考题解:https://www.cnblogs.com/ccz181078/p/7907022.html;

不过我感觉题解的压位有问题,(1<<x)还不炸上天。不过这题数据水,好像怎么写都能对,这里放上我认为正确的写法

//正经解法是计算一个F(x)表示经过x的最短路条数,然后找F(A)+F(B)=F(T),用map来做。
//而且F(x)可能很大,还要取模,一个不够的话可能还要取两个。
//而网上的这种随机算法相比之下就显得很简洁了(但由于这题数据很弱好像这部分写错也可以过)
//关于这种做法的正确性,显然所有的最短路都经过的点的f值为0
//那么为什么靠两个f值相同且非0且不能在树形图中互达的点能将图分成两个部分呢,我们可以考虑用一个点将两部分连起来
//这样这个点的f值为0,也就是说它能到所有点,那把它去掉图当然被分成两个部分。
#include<iostream>
#include<cmath>
#include<cstring>
#include<cstdio>
#include<algorithm>
#include<queue>
using namespace std;
typedef long long i64;
typedef unsigned long long u64;
typedef unsigned int u32;
const int N=5e4+;
int n,m,pp,cp,fa[N],S,T,last[N],pre[N*],other[N*],w[N*],t;
void add(int x,int y,int z){
++t;pre[t]=last[x];last[x]=t;other[t]=y;w[t]=z;
}
struct node{
int id;
i64 dis;
bool operator<(const node&a)const{
return dis>a.dis;
}
}A,B;
priority_queue<node>q;
bool vis[N];
i64 dis[N],ans=;
u64 f[N];
u32 can[N][N/+];
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 f1(int x){//从T往回找最短路图,我觉得和从S开始找是一样的。
vis[x]=;
for(int i=last[x];i;i=pre[i]){
int v=other[i];
if(dis[v]+w[i]==dis[x]){
if(!vis[v])fa[v]=x,f1(v);
else{
u64 z=rand();
z=z<<^rand();
f[x]^=z;f[fa[v]]^=z;
}
}
}
}
struct hehe{
int id;
u64 v,dis;
bool operator<(const hehe&a)const{
return v!=a.v?v<a.v:dis>a.dis;
}
}tmp[N];
void f2(int x){
_set(can[x],x);
vis[x]=;
for(int i=last[x];i;i=pre[i]){
int v=other[i];
if(dis[v]+w[i]==dis[x]){
if(vis[v])f2(v),f[x]^=f[v];
_or(can[x],can[v]);
}
}
if(f[x])tmp[pp++]=(hehe){x,f[x],dis[x]};
else ++cp;
}
void calc(){
f1(T);f2(T);
sort(tmp,tmp+pp);
for(int i=,j=;i<pp;i=j){
int t=;
for(++j;j<pp&&tmp[i].v==tmp[j].v;++j)t+=_get(can[tmp[i].id],tmp[j].id);
//图一定可以分成两个部分,一部分是经过A的最短路,一部分是经过B的,两部分没有交集。
ans+=i64(j-i-t)*t;//因为f值相同的是按dis值排序的,所以此时的f一定是按A,B分的两个集合中的一个。
}
ans+=cp*i64(n-cp-pp);
printf("%lld\n",ans);
//system("pause");
}
bool dijkstra(){
for(int i=;i<=n;++i)dis[i]=1ll<<;
A.id=S;A.dis=;dis[S]=;q.push(A);
while(!q.empty()){
B=q.top();q.pop();
if(B.dis!=dis[B.id])continue;
if(B.id==T){calc();return ;}
for(int i=last[B.id];i;i=pre[i]){
int v=other[i];
if(dis[v]>dis[B.id]+w[i]){
dis[v]=dis[B.id]+w[i];
A.id=v;A.dis=dis[v];q.push(A);
}
}
}
return ;
}
int main(){
int x,y,z;
cin>>n>>m>>S>>T;
srand(n^m^T^S^);
for(int i=;i<=m;++i){
scanf("%d%d%d",&x,&y,&z);
add(x,y,z);add(y,x,z);
}
if(!dijkstra())printf("%lld\n",n*i64(n-)/);
//system("pause");
return ;
}

bzoj5109(图论好题)的更多相关文章

  1. 11.07图论水题Test

    11.07图论水题Test 题目 描述 做法 \(BSOJ6378\) 在\(i\)位置可以到\(i+a_i\)或\(i+b_i\)求\(1\rightarrow n\)字典序最小路径 判可达性后贪心 ...

  2. 【转载】图论 500题——主要为hdu/poj/zoj

    转自——http://blog.csdn.net/qwe20060514/article/details/8112550 =============================以下是最小生成树+并 ...

  3. 山东省济南市历城第二中学——洛谷图论入门题--基本题必做 图的遍历—3.骑马修栅栏(fence)

    由于我这个破题提交了十四五遍,所以我决定写篇博客来记录一下. 这个题的题目描述是这样的 首先一看这个题我瞬间就想到了一笔画问题(欧拉回路). 对于能够一笔画的图,我们有以下两个定理. 定理1:存在欧拉 ...

  4. D9 图论综合题

    1.白银莲花池 LUOGU 2411 第一种思路:当然我们可以写三个bfs a掉这个题,这写下来一二百行要有了吧: 第二种:我们可以在一个bfs中维护所有的信息,一个方向数组,从起点开始,向八个方向扩 ...

  5. 专题:CF图论杂题

    题目是来自HZW的博客(构造题我是各种不会...) Solved 1 / 1 A CodeForces 500A New Year Transportation Solved 1 / 1 B Code ...

  6. BZOJ 1064: [Noi2008]假面舞会(dfs + 图论好题!)

    http://www.lydsy.com/JudgeOnline/problem.php?id=1064 题意: 思路: 考虑以下几种情况: ①无环并且是树: 无环的话就是树结构了,树结构的话想一下就 ...

  7. 【CZY选讲·一道图论神题】

    题目描述 LYK有一张无向图G={V,E},这张无向图有n个点m条边组成.并且这是一张带权图,只有点权. LYK想把这个图删干净,它的方法是这样的.每次选择一个点,将它删掉,但删这个点是需要代价的 ...

  8. 【CZY选讲·一道图论好题】

    题目描述 LYK有一张无向图G={V,E},这张无向图有n个点m条边组成.并且这是一张带权图,不仅有边权还有点权.LYK给出了一个子图的定义,一张图G'={V',E'}被称作G的子图,当且仅当: · ...

  9. 清北学堂模拟赛d2t1 一道图论神题(god)

    题目描述 LYK有一张无向图G={V,E},这张无向图有n个点m条边组成.并且这是一张带权图,只有点权. LYK想把这个图删干净,它的方法是这样的.每次选择一个点,将它删掉,但删这个点是需要代价的.假 ...

随机推荐

  1. TLS1.1升级到TLS1.2(微信小程序要求TLS1.2以上)

    检测是否具有TLS1.2:www.ssllabs.com 实验过的办法: https://www.cnblogs.com/wqcheng/p/6618070.html http://www.ocbc. ...

  2. [z]分区truncate操作的介绍及对全局索引和空间释放影响的案例解析

    [z]https://www.2cto.com/database/201301/181226.html 环境: [sql] [oracle@localhost ~]$ uname -r 2.6.18- ...

  3. Oracle_PL/SQL(8) 动态sql

    动态sql0.pl/sql块的限制 不能执行ddl操作(create.drop.alter): 不能执行部分dcl操作(grant.revoke). 1.语法动态sql:在执行时才能确定要执行的sql ...

  4. url中含有%

    Server.UrlEncode(“参数”)也可以使用javascript 的编码方式href="页面?name=encodeURI("参数")传送页代码编码 接收页代码 ...

  5. IDEA 调整 VM 配置文件(64位)

    64 位操作系统中 8G 内存以下的机子或是静态页面开发者是无需修改的. 64 位操作系统且内存大于 8G 的, 如果你是开发大型项目. Java 项目或是 Android 项目,建议进行修改 . 1 ...

  6. Android.DebugTools.Traceview & dmtracedump

    1. Android 调试工具之Traceview http://www.cnblogs.com/devinzhang/archive/2011/12/18/2291592.html TraceVie ...

  7. HDOJ2870 Largest Submatrix

    一道\(DP\) 原题链接 发现只有\(a,b,c\)三种情况,所以直接初始化成三个\(01\)方阵,找最大子矩阵即可. 我是先初始化垂直上的高度,然后对每一行处理出每个点向左向右的最大延伸,并不断计 ...

  8. 品味性能之道<十一>:JAVA中switch和if性能比较

    通常而言大家普遍的认知里switch case的效率高于if else.根据我的理解而言switch的查找类似于二叉树,if则是线性查找.按照此逻辑推理对于对比条件数目大于3时switch更优,并且对 ...

  9. spring学习十九 常用注解

    1. @Component 创建类对象,相当于配置<bean/>2. @Service 与@Component 功能相同. 2.1 写在 ServiceImpl 类上.3. @Reposi ...

  10. php结合layui实现前台加后台操作

    一:前台加载出前端页面: HTML: lay-data="{width:800,height:400, url:'data.php', page:true, id:'test'} js: l ...