bzoj5109(图论好题)
我的参考题解: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(图论好题)的更多相关文章
- 11.07图论水题Test
11.07图论水题Test 题目 描述 做法 \(BSOJ6378\) 在\(i\)位置可以到\(i+a_i\)或\(i+b_i\)求\(1\rightarrow n\)字典序最小路径 判可达性后贪心 ...
- 【转载】图论 500题——主要为hdu/poj/zoj
转自——http://blog.csdn.net/qwe20060514/article/details/8112550 =============================以下是最小生成树+并 ...
- 山东省济南市历城第二中学——洛谷图论入门题--基本题必做 图的遍历—3.骑马修栅栏(fence)
由于我这个破题提交了十四五遍,所以我决定写篇博客来记录一下. 这个题的题目描述是这样的 首先一看这个题我瞬间就想到了一笔画问题(欧拉回路). 对于能够一笔画的图,我们有以下两个定理. 定理1:存在欧拉 ...
- D9 图论综合题
1.白银莲花池 LUOGU 2411 第一种思路:当然我们可以写三个bfs a掉这个题,这写下来一二百行要有了吧: 第二种:我们可以在一个bfs中维护所有的信息,一个方向数组,从起点开始,向八个方向扩 ...
- 专题:CF图论杂题
题目是来自HZW的博客(构造题我是各种不会...) Solved 1 / 1 A CodeForces 500A New Year Transportation Solved 1 / 1 B Code ...
- BZOJ 1064: [Noi2008]假面舞会(dfs + 图论好题!)
http://www.lydsy.com/JudgeOnline/problem.php?id=1064 题意: 思路: 考虑以下几种情况: ①无环并且是树: 无环的话就是树结构了,树结构的话想一下就 ...
- 【CZY选讲·一道图论神题】
题目描述 LYK有一张无向图G={V,E},这张无向图有n个点m条边组成.并且这是一张带权图,只有点权. LYK想把这个图删干净,它的方法是这样的.每次选择一个点,将它删掉,但删这个点是需要代价的 ...
- 【CZY选讲·一道图论好题】
题目描述 LYK有一张无向图G={V,E},这张无向图有n个点m条边组成.并且这是一张带权图,不仅有边权还有点权.LYK给出了一个子图的定义,一张图G'={V',E'}被称作G的子图,当且仅当: · ...
- 清北学堂模拟赛d2t1 一道图论神题(god)
题目描述 LYK有一张无向图G={V,E},这张无向图有n个点m条边组成.并且这是一张带权图,只有点权. LYK想把这个图删干净,它的方法是这样的.每次选择一个点,将它删掉,但删这个点是需要代价的.假 ...
随机推荐
- eclipse中运行tomcat提示端口被占的4种解决方案
错误信息:Several ports (8005, 8080, 8009) required by Tomcat v5.5 Server at localhost are already in use ...
- 梦殇 chapter five
一弦情殇未谱,半纸离愁难书,不记年,叹花开几度...... 蜡烛用它自己的死亡来温暖别人,奉献自己的同时,它内心是快乐的吗?那残留的蜡油是它的泪水,还是它快乐的预兆? 这个世界上除了父母家人外,会有真 ...
- asp.net core webapi iis jquery No 'Access-Control-Allow-Origin' header is present on访问跨域问题
我的解决方案是:设置特定method允许所有请求源访问,具体看业务需求 第一步:starup文件下ConfigureServices中增加如下配置 //跨域//设置了允许所有来源 services.A ...
- NSIS Error:Error writing temporary file. Make sure your temp folder is valid的解决办法
我的是Win7 32位,当前登录用户已经是管理员,在安装腾讯视频电脑版时,提示以上错误,无法安装. 查了好多资料,按如下方法解决了: 在win7下,以管理员的身份打开cmd(在window\syste ...
- nginx与php-fpm原理
一.正向代理与反向代理 1.正向代理:访问google.com google.com vpn需要FQ才能访问 vpn 对于我们来说是可以感知到的(我们连接vpn),但对于google服务器是不知道 ...
- PAT 1063 计算谱半径(20)(代码)
1063 计算谱半径(20 分) 在数学中,矩阵的"谱半径"是指其特征值的模集合的上确界.换言之,对于给定的 n 个复数空间的特征值 { a1+b1i,⋯,an+ ...
- poj 2785 让和为0 暴力&二分
题目链接:http://poj.org/problem?id=2785 大意是输入一个n行四列的矩阵,每一列取一个数,就是四个数,求有多少种着四个数相加和为0的情况 首先脑海里想到的第一思维必然是一个 ...
- 全局组建封装(挂载到vue实例的原型中,通过this访问)
主题:组建的封装 一:install注册的全局封装(v-grid九宫格组建) 1.九宫格的封装主要有三个api 点击功能 每行个数 是否隐藏边框 ...
- openssl AES加密
此代码不涉及ECB和CBC等关联加密 #include <stdio.h> #include <string.h> #include <stdlib.h> #inc ...
- Emacs, Nano, or Vim 编辑器“三剑客”
# Vim 强大,多种模式相互切换,不同于传统“录入式“写东西 对后续两个编辑器不熟悉 # nano 退出ctrl + x http://man.linuxde.net/nano # emacs ht ...