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;
- }
LOJ#10064. 「一本通 3.1 例 1」黑暗城堡的更多相关文章
- LOJ #10131 「一本通 4.4 例 2」暗的连锁
LOJ #10131 「一本通 4.4 例 2」暗的连锁 给一棵 \(n\) 个点的树加上 \(m\) 条非树边 , 现在需要断开一条树边和一条非树边使得图不连通 , 求方案数 . $n \le 10 ...
- Loj 10115 「一本通 4.1 例 3」校门外的树 (树状数组)
题目链接:https://loj.ac/problem/10115 题目描述 原题来自:Vijos P1448 校门外有很多树,学校决定在某个时刻在某一段种上一种树,保证任一时刻不会出现两段相同种类的 ...
- LOJ#10065. 「一本通 3.1 例 2」北极通讯网络
题目链接:https://loj.ac/problem/10065 题目描述 原题来自:Waterloo University 2002 北极的某区域共有 nnn 座村庄,每座村庄的坐标用一对整数 ( ...
- LOJ#10106. 「一本通 3.7 例 2」单词游戏
题目链接:https://loj.ac/problem/10106 题目描述 来自 ICPC CERC 1999/2000,有改动. 有 NNN 个盘子,每个盘子上写着一个仅由小写字母组成的英文单词. ...
- LOJ #10132. 「一本通 4.4 例 3」异象石
题目地址 LOJ 题解 神仙思路.思路参考自<算法竞赛进阶指南>. 考虑维护dfs序中相邻两个石头的距离,那么每次?的答案就是sum/2(首尾算相邻) 然后维护一下拿个平衡树/set维护一 ...
- 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 10138 -「一本通 4.5 例 1」树的统计
树链剖分模板题,详见这篇博客.
- LOJ 10155 - 「一本通 5.2 例 3」数字转换
前言 从现在开始,这个博客要写一些题解了.起初,开这个博客只是好玩一样,没事就写写CSS.JS,然后把博客前端搞成了现在这个样子.以前博客只是偶尔记录一些东西,刷题也从来不记录,最近受一些学长的影响, ...
- loj #10001. 「一本通 1.1 例 2」种树
题面 解题思路 贪心,首先按右端点排序,然后从小往大扫,因为要求树最少,所以要尽量放在右端点.然后开个bool数组判断是否种过树即可. 代码 #include<iostream> #inc ...
随机推荐
- 【转】javascript 的类,原型,继承的理解
原文: https://www.cnblogs.com/codernie/p/9098184.html ------------------------------------------------ ...
- EffectiveJava(21)策略模式多种方式实现字符串比较
**调用对象上的方法通常是执行该对象上的某项操作**. 如果一个对象的方法执行其他对象的操作,一个类仅仅导出这个方法(它的实例相当于一个指向该方法的指针),这样的实例被称为函数对象 例如: /** * ...
- <p>在静态类junit.framework.Assert或者静态类org.junit.Assert中存在下面几个方法</p>
在静态类junit.framework.Assert或者静态类org.junit.Assert中存在下面几个方法 1.assertEquals()方法,用来查看对象中存的值是否是期待的值,与字符串比較 ...
- Servlet基本用法二接口和类
转自:http://www.cnblogs.com/xujian2014/p/4536168.html 一.摘要 本文主要简单介绍开发Servlet需要用到的接口和类. 二.ServletReques ...
- nginx限速
nginx 要实现限速,完整的实现是要限制客户端请求频率,并发连接和传输速度 1.请求限制 Nginx 请求限制的功能来自于 ngx_http_limit_req_module 模块.使用它需要首先在 ...
- C++井字棋游戏,DOS界面版
据说有一个能保证不败的算法.明天看看先再写个PVC版的. 正题.今天无聊写了个井字棋游戏,顺便逐渐让自己习惯良好的代码风格,放上来给新手学习学习. jzq2.cpp /* N字棋游戏PVP版,DOS版 ...
- 微信公众号开发之创建菜单栏代码示例(php)
思路很简单:就是先获取access_token,然后带着一定规则的json数据参数请求创建菜单的接口.废话不多讲,直接上代码. class Wechat { public $APPID="w ...
- JS-以鼠标位置为中心的滑轮放大功能demo1
以鼠标位置为中心的滑轮放大功能demo1 <!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" &qu ...
- 查看系统启动内核检測硬件信息dmesg
dmesg用来显示开机信息.kernel会将开机信息存储在ring buffer中.您若是开机时来不及查看信息,可利用dmesg来查看.开机信息亦保存在/var/log文件夹中.名称为dmesg的文件 ...
- mac Xvim 语法高亮
步骤1: cp /usr/share/vim/vimrc ~/.vimrc 先复制一份vim配置模板到个人目录下 注:redhat 改成 cp /etc/vimrc ~/.vimrc 步骤2: vi ...