LOJ#10064. 「一本通 3.1 例 1」黑暗城堡

题目描述

你知道黑暗城堡有$N$个房间,$M$条可以制造的双向通道,以及每条通道的长度。

城堡是树形的并且满足下面的条件:

设$D_i$为如果所有的通道都被修建,第$i$号房间与第$1$号房间的最短路径长度;

而$S_i$为实际修建的树形城堡中第$i$号房间与第$1$号房间的路径长度;

要求对于所有整数$i(1\le i\le N)$,有$S_i= D_i$成立。

你想知道有多少种不同的城堡修建方案。当然,你只需要输出答案对$2^{31}-1$取模之后的结果就行了。

输入格式

第一行为两个由空格隔开的整数$N, M$;

第二行到第$M+1$行为$3$个由空格隔开的整数$x, y, l$:表示$x$号房间与$y$号房间之间的通道长度为$l$。

输出格式

一个整数:不同的城堡修建方案数对$2^{31}-1$取模之后的结果。

样例

样例输入

4 6
1 2 1
1 3 2
1 4 3
2 3 1
2 4 2
3 4 1

样例输出

6

样例说明

一共有$4$个房间,$6$条道路,其中$1$号和$2$号,$1$号和$3$号,$1$号和$4$号,$2$号和$3$号,$2$号和$4$号,$3$号和$4$号房间之间的通道长度分别为$1$,$2$,$3$,$1$,$2$,$1$。

而不同的城堡修建方案数对$2^{31} -1$取模之后的结果为$6$。

数据范围与提示

对于全部数据,$1\le N\le 1000$,$1\le M\le \frac{N(N-1)}{2}$,$1\le l\le 200$。


题解Here!

据说标解是最短路径树?但是本蒟蒻不会啊。。。

然后开始$YY$。。。

首先一发最短路没的说。

我直接$SPFA$的,出题人良心,没有卡$SPFA$。

然后把所有可能在生成树上的边提出来。

我们会发现这些边形成了一个$DAG$。

然后对于每个点(除了$1$),我们一定至少有一种选择方案,将它挂在某个节点的下面,成为儿子节点。

所以我们把这些点的选择方案数乘起来就是我们的答案。

而每个点$i$的选择方案就是这个点在$DAG$中的入度$indegree[i]$。

答案可以表示成:$$Ans=\prod_{i=2}^n indegree[i]$$

然后就没了。

记得开$long\ long$。

附代码:

#include<iostream>
#include<algorithm>
#include<cstdio>
#include<queue>
#define MAXN 1010
#define MAX 999999999
#define MOD 2147483647LL
using namespace std;
int n,m,c=1;
int head[MAXN],path[MAXN];
long long ans=1,indegree[MAXN];
bool vis[MAXN];
struct Grpah{int next,to,w;
}edge[MAXN*MAXN];
inline int read(){int date=0,w=1;char c=0;while(c<'0'||c>'9'){if(c=='-')w=-1;c=getchar();}while(c>='0'&&c<='9'){date=date*10+c-'0';c=getchar();}return date*w;
}
inline int relax(int u,int v,int w){if(path[v]>path[u]+w){path[v]=path[u]+w;return 1;}return 0;
}
inline void add_edge(int u,int v,int w){edge[c].to=v;edge[c].w=w;edge[c].next=head[u];head[u]=c++;edge[c].to=u;edge[c].w=w;edge[c].next=head[v];head[v]=c++;
}
void spfa(){int u,v;queue<int> q;for(int i=1;i<=n;i++){path[i]=MAX;vis[i]=false;}path[1]=0;vis[1]=true;q.push(1);while(!q.empty()){u=q.front();q.pop();vis[u]=false;for(int i=head[u];i;i=edge[i].next){v=edge[i].to;if(relax(u,v,edge[i].w)&&!vis[v]){vis[v]=true;q.push(v);}}}
}
void work(){int u,v,w;for(int i=1;i<c;i+=2){u=edge[i+1].to;v=edge[i].to;w=edge[i].w;if(path[u]+w==path[v])indegree[v]++;if(path[v]+w==path[u])indegree[u]++;}for(int i=2;i<=n;i++)ans=ans*indegree[i]%MOD;printf("%lld\n",ans);
}
void init(){int u,v,w;n=read();m=read();for(int i=1;i<=m;i++){u=read();v=read();w=read();add_edge(u,v,w);}spfa();
}
int main(){init();work();return 0;
}

转载于:https://www.cnblogs.com/Yangrui-Blog/p/9931474.html

LOJ#10064. 「一本通 3.1 例 1」黑暗城堡相关推荐

  1. Loj 10115 「一本通 4.1 例 3」校门外的树 (树状数组)

    题目链接:https://loj.ac/problem/10115 题目描述 原题来自:Vijos P1448 校门外有很多树,学校决定在某个时刻在某一段种上一种树,保证任一时刻不会出现两段相同种类的 ...

  2. LOJ #10222. 「一本通 6.5 例 4」佳佳的 Fibonacci

    题目链接 题目大意 $$F[i]=F[i-1]+F[i-2]\ (\ F[1]=1\ ,\ F[2]=1\ )$$ $$T[i]=F[1]+2F[2]+3F[3]+...+nF[n]$$ 求$T[n] ...

  3. LOJ #10155. 「一本通 5.2 例 3」数字转换

    无向图的最长链怎么求?和树的直径求法相同. #include <bits/stdc++.h> using namespace std; const int N=5e4+5; int n,a ...

  4. LOJ 10155. 「一本通 5.2 例 3」数字转换

    题目:数字转换 思路: 对于每一个数,把它和它能够转移到的数之间连一条边. 由于不存在多元环,这个图本质上是一棵树. 然后在树上求最长链的长度就可以了. 具体实现就是dfs遍历整棵树,对于以每个点ii ...

  5. LOJ 10155 - 「一本通 5.2 例 3」数字转换

    前言 从现在开始,这个博客要写一些题解了.起初,开这个博客只是好玩一样,没事就写写CSS.JS,然后把博客前端搞成了现在这个样子.以前博客只是偶尔记录一些东西,刷题也从来不记录,最近受一些学长的影响, ...

  6. 【C++】「一本通 1.1 例 4」加工生产调度

    「一本通 1.1 例 4」加工生产调度 [来源] [题目描述] [输入格式] [输出格式] [输入样例] [输出样例] [数据范围] [解析] [代码] [来源] 一本通题库-1425 LibreOJ ...

  7. LibreOJ10082. 「一本通 3.3 例 1」Word Rings【二分+SPFA】

    10082. 「一本通 3.3 例 1」Word Rings [题目描述] 传送门 [题解] 将一个字符串看成一条边,字符两端的字符看成节点,长度看成权值.二分枚举答案,最后SPFA刷正环,因为只要有 ...

  8. 【C++】「一本通 1.1 例 2」种树

    「一本通 1.1 例 2」种树 [来源] [题目描述] [输入格式] [输出格式] [输入样例] [输出样例] [解析] [代码] [来源] 一本通题库-1423 LibreOJ-10001 vjud ...

  9. #10001. 「一本通 1.1 例 2」种树

    #10001. 「一本通 1.1 例 2」种树 满足n个区间种树的要求,求最少种多少棵数 思路 按照区间的尾巴来排序,因为如果区间有重叠的种在第一个区间的尾巴可以使得种树更少,所有每次始从尾巴开始种树 ...

  10. 【C++】「一本通 1.1 例 5」智力大冲浪

    「一本通 1.1 例 5」智力大冲浪 [来源] [题目描述] [输入格式] [输出格式] [输入样例] [输出样例] [数据范围] [解析] [代码] [来源] 一本通题库-1426 LibreOJ- ...

最新文章

  1. Windows DOS窗口查看历史执行过的命令的三种方式
  2. 代替Mask R-CNN,BlendMask欲做实例预测任务的新基准?
  3. 英伟达驱动更新记录_N卡驱动更新软件(NVIDIA GeForce Experience) v3.16.0.122 官方版
  4. 产品经理跳槽面试大揭秘……
  5. 独占设备的分配和回收模拟_系统设计硬核知识(4)——操作系统的设备管理...
  6. 【Python】怎么用matplotlib画出漂亮的分析图表
  7. python3讨论交流地_讨论 - 廖雪峰的官方网站
  8. redis的安装和使用【2】redis的java操作
  9. yolo算法的优缺点分析_yolo算法介绍
  10. python中面向对象的特殊成员_Python面向对象特殊成员
  11. 用qq号获取用户头像和昵称
  12. verp之增加接近传感器(proximity sensor)
  13. linux strace cpu,如何定位死循环或高CPU使用率(linux)
  14. python绘制小猪佩奇
  15. 伦敦皇家音乐学院公爵厅混响当前已添加到Altiverb 7软件
  16. Git GUI中文乱码解决问题
  17. MAC电脑触摸板手势(提高办公效率)
  18. 爱奇艺很高兴接受元宇宙及其概念
  19. Flutter 调用百度地图APP实现位置搜索、路线规划
  20. 移动端一个按钮长按以及点击事件(js)

热门文章

  1. 集合addAll方法使用存在的问题。
  2. 一文让你理解什么是shallow heap及retained heap
  3. java 滑杆和进度条_进度条 和 滑条
  4. 工欲善其事必先利其器(一) —— VScode
  5. Dart Isolate
  6. 怎么用计算机打印出东西,怎样在电脑上打印东西_怎么用电脑打印东西
  7. IDEA Maven下载依赖时报错: ERROR - #org.jetbrains.idea.maven - Cannot reconnect.
  8. MCS51 系列单片机的中央处理器(CPU)
  9. 【软件测试基础知识】SDK是什么?
  10. 数据分析报告的 8 种颜色