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」黑暗城堡的更多相关文章

  1. LOJ #10131 「一本通 4.4 例 2」暗的连锁

    LOJ #10131 「一本通 4.4 例 2」暗的连锁 给一棵 \(n\) 个点的树加上 \(m\) 条非树边 , 现在需要断开一条树边和一条非树边使得图不连通 , 求方案数 . $n \le 10 ...

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

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

  3. LOJ#10065. 「一本通 3.1 例 2」北极通讯网络

    题目链接:https://loj.ac/problem/10065 题目描述 原题来自:Waterloo University 2002 北极的某区域共有 nnn 座村庄,每座村庄的坐标用一对整数 ( ...

  4. LOJ#10106. 「一本通 3.7 例 2」单词游戏

    题目链接:https://loj.ac/problem/10106 题目描述 来自 ICPC CERC 1999/2000,有改动. 有 NNN 个盘子,每个盘子上写着一个仅由小写字母组成的英文单词. ...

  5. LOJ #10132. 「一本通 4.4 例 3」异象石

    题目地址 LOJ 题解 神仙思路.思路参考自<算法竞赛进阶指南>. 考虑维护dfs序中相邻两个石头的距离,那么每次?的答案就是sum/2(首尾算相邻) 然后维护一下拿个平衡树/set维护一 ...

  6. 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] ...

  7. LOJ 10138 -「一本通 4.5 例 1」树的统计

    树链剖分模板题,详见这篇博客.

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

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

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

    题面 解题思路 贪心,首先按右端点排序,然后从小往大扫,因为要求树最少,所以要尽量放在右端点.然后开个bool数组判断是否种过树即可. 代码 #include<iostream> #inc ...

随机推荐

  1. 2016.6.30 tomcat开启时,显示端口被占用,如何修改端口

    开启tomcat时,有时候会显示端口8080已占用,所以需要将端口改为其他值. 找到tomcat的server.xml文件,修改为8088,如图所示:

  2. DevExpress控件之LayoutControl

    一.项目运行中不显示右键菜单 layoutControl1.AllowCustomization = false 二.控件超出容器后不显示滚动条 layoutControl1.AtuoScroll = ...

  3. 如何看一个VC工程具体是什么工程?

    VC6等可以创建MFC, Win32等工程,拿到一个工程,怎么判断是什么工程呢? VC6全文检索看看有没有theApp 如果有一般就是MFC的 (VS?)看看工程设置,入口点函数写的是什么,/subs ...

  4. Android学习(四) Layout五大布局

    我们知道Android系统应用程序一般是由多个Activity组成,而这些Activity以视图的形式展现在我们面前, 视图都是由一个一个的组件构成的.组件就是我们常见的Button.TextEdit ...

  5. ionic准备之angular基础——run方法(4)

    可以看到整个angular.module对象具有以下各种属性和方法 <!DOCTYPE html> <html lang="en"> <head> ...

  6. SQL中拆分字符串substr及统计字符出现频数replace用法实例讲解

    一.拆分字符串为若干行 例一:要求将表emp中的'king'按照每行一个单词拆成四行 注意:substr(str,pos):截取pos位置开始的字符: substr(str,pos,len):从pos ...

  7. C#中的里氏替换原则

    里氏转换原则 子类可以赋值给父类对象 父类对象可以强制转化为对应的子类对象 里氏替换原则直观理解就是"子类是父类",反过来就说不通了. 就像男人是人对的,但人是男人就不对了. 这样 ...

  8. sprint3 【每日scrum】 TD助手站立会议第七天

    站立会议 组员 昨天 今天 困难 签到 刘铸辉 (组长) 在日历各个事件上都增加闹钟显示,并将数据传递给日程和时间表 调整闹钟和整个项目的显示效果,最后做出了微信界面滑动的显示效果 闹钟在广播协议的时 ...

  9. 征信报告页面的input验证收集

    https://ipcrs.pbccrc.org.cn/ function checkLoginName() { var loginName = $.trim($("#loginname&q ...

  10. Atitit swt 4.3 4.4 4.5 新特性java attilax总结

    Atitit swt 4.3 4.4 4.5 新特性java attilax总结 1. 4.5 Release - June 3, 20151 1.1. Older Releases1 2. SWT  ...