LOJ#10064. 「一本通 3.1 例 1」黑暗城堡
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」黑暗城堡相关推荐
- Loj 10115 「一本通 4.1 例 3」校门外的树 (树状数组)
题目链接:https://loj.ac/problem/10115 题目描述 原题来自:Vijos P1448 校门外有很多树,学校决定在某个时刻在某一段种上一种树,保证任一时刻不会出现两段相同种类的 ...
- 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] ...
- LOJ #10155. 「一本通 5.2 例 3」数字转换
无向图的最长链怎么求?和树的直径求法相同. #include <bits/stdc++.h> using namespace std; const int N=5e4+5; int n,a ...
- LOJ 10155. 「一本通 5.2 例 3」数字转换
题目:数字转换 思路: 对于每一个数,把它和它能够转移到的数之间连一条边. 由于不存在多元环,这个图本质上是一棵树. 然后在树上求最长链的长度就可以了. 具体实现就是dfs遍历整棵树,对于以每个点ii ...
- LOJ 10155 - 「一本通 5.2 例 3」数字转换
前言 从现在开始,这个博客要写一些题解了.起初,开这个博客只是好玩一样,没事就写写CSS.JS,然后把博客前端搞成了现在这个样子.以前博客只是偶尔记录一些东西,刷题也从来不记录,最近受一些学长的影响, ...
- 【C++】「一本通 1.1 例 4」加工生产调度
「一本通 1.1 例 4」加工生产调度 [来源] [题目描述] [输入格式] [输出格式] [输入样例] [输出样例] [数据范围] [解析] [代码] [来源] 一本通题库-1425 LibreOJ ...
- LibreOJ10082. 「一本通 3.3 例 1」Word Rings【二分+SPFA】
10082. 「一本通 3.3 例 1」Word Rings [题目描述] 传送门 [题解] 将一个字符串看成一条边,字符两端的字符看成节点,长度看成权值.二分枚举答案,最后SPFA刷正环,因为只要有 ...
- 【C++】「一本通 1.1 例 2」种树
「一本通 1.1 例 2」种树 [来源] [题目描述] [输入格式] [输出格式] [输入样例] [输出样例] [解析] [代码] [来源] 一本通题库-1423 LibreOJ-10001 vjud ...
- #10001. 「一本通 1.1 例 2」种树
#10001. 「一本通 1.1 例 2」种树 满足n个区间种树的要求,求最少种多少棵数 思路 按照区间的尾巴来排序,因为如果区间有重叠的种在第一个区间的尾巴可以使得种树更少,所有每次始从尾巴开始种树 ...
- 【C++】「一本通 1.1 例 5」智力大冲浪
「一本通 1.1 例 5」智力大冲浪 [来源] [题目描述] [输入格式] [输出格式] [输入样例] [输出样例] [数据范围] [解析] [代码] [来源] 一本通题库-1426 LibreOJ- ...
最新文章
- Windows DOS窗口查看历史执行过的命令的三种方式
- 代替Mask R-CNN,BlendMask欲做实例预测任务的新基准?
- 英伟达驱动更新记录_N卡驱动更新软件(NVIDIA GeForce Experience) v3.16.0.122 官方版
- 产品经理跳槽面试大揭秘……
- 独占设备的分配和回收模拟_系统设计硬核知识(4)——操作系统的设备管理...
- 【Python】怎么用matplotlib画出漂亮的分析图表
- python3讨论交流地_讨论 - 廖雪峰的官方网站
- redis的安装和使用【2】redis的java操作
- yolo算法的优缺点分析_yolo算法介绍
- python中面向对象的特殊成员_Python面向对象特殊成员
- 用qq号获取用户头像和昵称
- verp之增加接近传感器(proximity sensor)
- linux strace cpu,如何定位死循环或高CPU使用率(linux)
- python绘制小猪佩奇
- 伦敦皇家音乐学院公爵厅混响当前已添加到Altiverb 7软件
- Git GUI中文乱码解决问题
- MAC电脑触摸板手势(提高办公效率)
- 爱奇艺很高兴接受元宇宙及其概念
- Flutter 调用百度地图APP实现位置搜索、路线规划
- 移动端一个按钮长按以及点击事件(js)
热门文章
- 集合addAll方法使用存在的问题。
- 一文让你理解什么是shallow heap及retained heap
- java 滑杆和进度条_进度条 和 滑条
- 工欲善其事必先利其器(一) —— VScode
- Dart Isolate
- 怎么用计算机打印出东西,怎样在电脑上打印东西_怎么用电脑打印东西
- IDEA Maven下载依赖时报错: ERROR - #org.jetbrains.idea.maven - Cannot reconnect.
- MCS51 系列单片机的中央处理器(CPU)
- 【软件测试基础知识】SDK是什么?
- 数据分析报告的 8 种颜色