[传递闭包 BITSET] 「CodePlus 2017 11 月赛」大吉大利,晚上吃鸡!
来源:互联网 发布:java代码短信发送demo 编辑:程序博客网 时间:2024/04/28 01:10
建出最短路图
—(以下复制自官方题解)
定义
对于条件
时间复杂度:
#include <cstdio>#include <iostream>#include <algorithm>#include <queue>#include <bitset>#include <map>#include <vector>using namespace std;typedef long long ll;const int N=50010;int n,m,cnt,G[N];struct edge{ int t,nx,w;}E[N<<1];int S,T;inline void addedge(int x,int y,int z){ E[++cnt].t=y; E[cnt].nx=G[x]; E[cnt].w=z; G[x]=cnt; E[++cnt].t=x; E[cnt].nx=G[y]; E[cnt].w=z; G[y]=cnt;}queue<int> Q;int vis[N],iT[N]; ll dis[N],rdis[N];inline void spfa(ll *dis,int S){ for(int i=1;i<=n;i++) dis[i]=1LL<<60,vis[i]=0; Q.push(S); vis[S]=1; dis[S]=0; while(!Q.empty()){ int x=Q.front(); Q.pop(); vis[x]=0; for(int i=G[x];i;i=E[i].nx) if(dis[E[i].t]>dis[x]+E[i].w){ dis[E[i].t]=dis[x]+E[i].w; if(!vis[E[i].t]) vis[E[i].t]=1,Q.push(E[i].t); } }}namespace Grp{ int G[N],rG[N],du[N],rdu[N],cnt; struct edge{ int s,t,nx; }E[N<<2]; inline void addedge(int x,int y){ E[++cnt].t=y; E[cnt].s=x; E[cnt].nx=G[x]; G[x]=cnt; du[y]++; E[++cnt].t=x; E[cnt].s=y; E[cnt].nx=rG[y]; rG[y]=cnt; rdu[x]++; } ll f[N],g[N]; queue<int> Q; bitset<N> lnk[N],rlnk[N]; map<ll,bitset<N> > M; inline ll solve(){ f[S]=1; g[T]=1; Q.push(S); while(!Q.empty()){ int x=Q.front(); Q.pop(); for(int i=G[x];i;i=E[i].nx){ f[E[i].t]+=f[x]; if(!--du[E[i].t]) Q.push(E[i].t); } } Q.push(T); while(!Q.empty()){ int x=Q.front(); Q.pop(); for(int i=rG[x];i;i=E[i].nx){ g[E[i].t]+=g[x]; if(!--rdu[E[i].t]) Q.push(E[i].t); } } for(int i=1;i<=n;i++) lnk[i].set(i); for(int i=1;i<n;i++) for(int j=1;j<=cnt;j+=2) lnk[E[j].s]|=lnk[E[j].t]; for(int i=1;i<n;i++) for(int j=2;j<=cnt;j+=2) rlnk[E[j].s]|=rlnk[E[j].t]; for(int i=1;i<=n;i++) M[f[i]*g[i]].set(i); ll ret=0; for(int i=1;i<=n;i++){ if(!M.count(f[T]-f[i]*g[i])) continue; ret+=(M[f[T]-f[i]*g[i]]&~lnk[i]&~rlnk[i]).count(); } return ret>>1; }}int main(){ freopen("6252.in","r",stdin); freopen("6252.out","w",stdout); scanf("%d%d%d%d",&n,&m,&S,&T); for(int i=1,x,y,z;i<=m;i++) scanf("%d%d%d",&x,&y,&z),addedge(x,y,z); spfa(dis,S); spfa(rdis,T); for(int i=1;i<=n;i++) if(dis[i]+rdis[i]==dis[T]) iT[i]=1; for(int x=1;x<=n;x++){ if(!iT[x]) continue; for(int i=G[x];i;i=E[i].nx) if(dis[E[i].t]==dis[x]+E[i].w && iT[E[i].t]) Grp::addedge(x,E[i].t); } printf("%lld\n",Grp::solve()); return 0;}
阅读全文
0 0
- [传递闭包 BITSET] 「CodePlus 2017 11 月赛」大吉大利,晚上吃鸡!
- BZOJ5109:[CodePlus 2017]大吉大利,晚上吃鸡! (最短路+Hash表+二进制压位)
- 清华月赛 大吉大利晚上吃鸡题解
- [DP] 「CodePlus 2017 11 月赛」找爸爸
- [贪心]「CodePlus 2017 11 月赛」可做题
- 「CodePlus 2017 11 月赛」找爸爸
- 「CodePlus 2017 11 月赛」可做题
- #6249. 「CodePlus 2017 11 月赛」汀博尔 二分
- 【loj6258】「CodePlus 2017 12 月赛」火锅盛宴
- 【loj6257】「CodePlus 2017 12 月赛」可做题2
- CodePlus 2017 11 月赛 Div. 2
- CodePlus 2017 11 月赛 div2 题解
- (水)#6248. 「CodePlus 2017 11 月赛」晨跑
- [线段树]「CodePlus 2017 11 月赛」Yazid 的新生舞会
- LOJ6253:「CodePlus 2017 11 月赛」Yazid 的新生舞会 (线段树)
- LOJ #6249. 「CodePlus 2017 11 月赛」汀博尔 ( 二分
- 「CodePlus 2017 12 月赛」白金元首与独舞
- LOJ #6256. 「CodePlus 2017 12 月赛」可做题1
- extra 实现 别名,条件,排序等
- 决策树算法实现
- 岭回归 & lasso 回归
- 阿里云UBUNTU桌面的设置和远程SSH连接
- Noip 2013 提高组 Day1 T2 火柴排队
- [传递闭包 BITSET] 「CodePlus 2017 11 月赛」大吉大利,晚上吃鸡!
- HyperLPR
- Cg Programming/Unity/Toon Shading卡通着色
- CSS解读之box-sizing属性
- jsp中时间的显示问题
- MATLAB Notes
- Problem H 小鑫查卫生
- 采用freemarker模板引擎作为Java邮件模板
- 图像处理-像素点分析