路径方案数(mod)
路径方案数(mod)
[题目描述]
给一张无向图,n 个点和 m 条边,cyb 在 1 号点,他要去 2 号点,
cyb 可以从 a 走到 b,当且仅当a到2的最短路,比b 到2的最短路长。
求 cyb 的路径方案数
两条路径不同,当且仅当将两条路径中依次经过的边的编号不完全相同,
图可能会有重边;
由于答案可能很大,
只需要输出答案对于 10^9+9 取模的值即可
[输入文件]
第一行两个正整数 n,m
接下来 m 行
每行 x,y,z 表示有一条边,长度为 z,链接了 x,y
[输出文件]
一个正整数表示答案
[输入样例1] [输入样例2]
5 6 7 8
1 3 2 1 3 1
1 4 2 1 4 1
3 4 3 3 7 1
1 5 12 7 4 1
4 2 34 7 5 1
5 2 24 6 7 1
5 2 1
6 2 1
[输出样例 1] [输出样例 2]
2 4
[数据范围]
30%: N<=100,M<=1000
100%: N<=50000,,M<=100000
每条边的长度<=1000
题解:
首先处理出每个点到2的距离,重新建图,跑一遍拓扑排序,注意一下统计路径数量就可以了。
#include<iostream>
#include<cstdio>
#include<cstring>
#include<cstdlib>
#include<cmath>
#include<algorithm>
#include<queue>
#define mod (1000000009)
using namespace std;
typedef long long lol;
lol n,m;
struct node{lol next,to,dis;}edge[];
struct Map{lol from,to;}map[];
lol head[],size=;
void putin(lol from,lol to,lol dis){size++;edge[size].next=head[from];edge[size].to=to;edge[size].dis=dis;head[from]=size;}
lol gi()
{
lol ans=,f=;
char i=getchar();
while(i<''||i>''){if(i=='-')f=-;i=getchar();}
while(i>=''&&i<=''){ans=ans*+i-'';i=getchar();}
return ans*f;
}
lol dist[];
bool vis[];
void SPFA(lol r)
{
lol i,j;
memset(dist,/,sizeof(dist));
queue<lol>mem;
dist[r]=;
vis[r]=;
mem.push(r);
while(!mem.empty())
{
lol x=mem.front();mem.pop();
vis[x]=;
for(i=head[x];i!=-;i=edge[i].next)
{
lol y=edge[i].to;
if(dist[y]>dist[x]+edge[i].dis)
{
dist[y]=dist[x]+edge[i].dis;
if(!vis[y])
{
mem.push(y);
vis[y]=;
}
}
}
}
}
lol in[];
void make()
{
lol i;
memset(head,-,sizeof(head));
size=;
for(i=;i<=m;i++)
{
if(dist[map[i].from]>dist[map[i].to])putin(map[i].from,map[i].to,),in[map[i].to]++;
else if(dist[map[i].from]<dist[map[i].to])putin(map[i].to,map[i].from,),in[map[i].from]++;
}
return;
}
lol ans[];
void solve(lol r)
{
lol i;
memset(vis,,sizeof(vis));
queue<lol>mem;
ans[r]=;
for(i=;i<=n;i++)
if(!in[i])
{
mem.push(i);
vis[i]=;
}
while(!mem.empty())
{
lol x=mem.front();mem.pop();
vis[x]=;
for(i=head[x];i!=-;i=edge[i].next)
{
lol y=edge[i].to;
ans[y]=(ans[y]+ans[x])%mod;
in[y]--;
if(!in[y]&&!vis[y])mem.push(y),vis[y]=;
}
}
}
int main()
{
lol i,j;
n=gi();m=gi();
memset(head,-,sizeof(head));
for(i=;i<=m;i++)
{
lol from=gi(),to=gi(),dis=gi();
map[i].from=from;map[i].to=to;
putin(from,to,dis);
putin(to,from,dis);
}
SPFA();
make();
solve();
printf("%lld",ans[]);
return ;
}
路径方案数(mod)的更多相关文章
- 路径方案数 [SPFA,拓扑排序]
路径方案数 [题目描述] 给一张无向图,n 个点和 m 条边,cyb 在 1 号点,他要去 2 号点, cyb 可以从 a 走到 b,当且仅当 a 到 2 的最短路,比 b 到 2 的最短路长. 求 ...
- ☆ [HDU2157] How many ways?? 「矩阵乘法求路径方案数」
传送门:>Here< 题意:给出一张有向图,问从点A到点B恰好经过k个点(包括终点)的路径方案数 解题思路 一道矩阵乘法的好题!妙哉~ 话说把矩阵乘法放在图上好神奇,那么跟矩阵唯一有关的就 ...
- LGV 引理——二维DAG上 n 点对不相交路径方案数
文章目录 引入 简介 定义 引理 证明 例题 释疑 扩展 引入 有这样一个问题: 甲和乙在一张网格图上,初始位置 ( x 1 , y 1 ) , ( x 2 , y 2 ) (x_1,y_1),(x_ ...
- 路径方案数_mod_SPFA_记忆化搜索_C++
本文含有原创题,涉及版权利益问题,严禁转载,违者追究法律责任 本来是写个 DP 分分钟就 A 了,结果老师要我们写记忆化搜索(无奈脸) 算啦,随手一改又是一个标准的记忆化搜索(目测好像是记忆化搜索容易 ...
- hdu 2157 从a点走到b点刚好k步的方案数是多少 (矩阵快速幂)
n个点 m条路 询问T次 从a点走到b点刚好k步的方案数是多少 给定一个有向图,问从A点恰好走k步(允许重复经过边)到达B点的方案数mod p的值把 给定的图转为邻接矩阵,即A(i,j)=1当且仅当存 ...
- 【LOJ】#2277. 「HAOI2017」方案数
题解 这个出题人完美诠释了什么叫 用心出题,用脚造数据 算完复杂度怎么也得\(O(o^2 * 200)\)略微跑不满,但是有8个测试点虽然有障碍但是一个障碍都不在路径上,2个测试点只有10来个点在路径 ...
- Codeforces 461B. Appleman and Tree[树形DP 方案数]
B. Appleman and Tree time limit per test 2 seconds memory limit per test 256 megabytes input standar ...
- NOIP2012pj摆花[DP 多重背包方案数]
题目描述 小明的花店新开张,为了吸引顾客,他想在花店的门口摆上一排花,共m盆.通过调查顾客的喜好,小明列出了顾客最喜欢的n种花,从1到n标号.为了在门口展出更多种花,规定第i种花不能超过ai盆,摆花时 ...
- poj2975 Nim 胜利的方案数
Nim Time Limit: 1000MS Memory Limit: 65536K Total Submissions: 5545 Accepted: 2597 Description N ...
随机推荐
- MAC OS Sierra 10.12.6 下对固态硬盘SSD 开启TRIM功能
这个是对于不是mac原装SSD的情况下才做的操作... 大家都知道,苹果店卖的SSD硬盘那怕就是一个256G的也要1000多人民币,而市场上的也就400-500左右人民币,整整少了一半还要多,可见JS ...
- python 之闭包,装饰器,生成器
一.可迭代的对象(也就是可以用for循环,generator 是生成器的意思) 怎么判断是否可迭代呢?通俗的方法建立一个for循环 高大上的方法是: In [40]: from collections ...
- express使用https
目录 申请免费ssl证书 修改express的./bin/www 申请免费ssl证书 直接去阿里云申请一个免费的ssl,选择neginx下载证书就可以了,解压得到一个xxx.key.xxx.crt文件 ...
- hdu 3625 Examining the Rooms —— 第一类斯特林数
题目:http://acm.hdu.edu.cn/showproblem.php?pid=3625 学习斯特林数:https://blog.csdn.net/qq_33229466/article/d ...
- mysql建表练习
create table class( cid int primary key auto_increment, caption ) not null )engine=innodb; create ta ...
- POCO库中文编程参考指南(11)如何使用Reactor框架?
1 Reactor 框架概述 POCO 中的 Reactor 框架是基于 Reactor 设计模式进行设计的.其中由 Handler 将某 Socket 产生的事件,发送到指定的对象的方法上,作为回调 ...
- <c和指针>学习笔记3之操作符,表达式与指针
1 操作符 (1)移位操作符 左移<<:值最左边的几位丢弃,右边多出来的几个空位用0补齐 01101101 011(丢弃)01101000(后面三位补0) 右移>>: 算术左移 ...
- Django 框架
MVC 框架和MTV框架 (了解即可) MVC,全名是Model View Controller,是软件工程中的一种软件架构模式,把软件系统分为三个基本部分:模型(Model).视图(View)和控 ...
- android edittext 限制小数点后最多只能输入两位数字
android:inputType="numberDecimal" private InputFilter lengthFilter = new InputFilter() { @ ...
- 数据可视化系列--svg入门基础(一)
一.前言 1.SVG(Scalable Vector Graphics)可伸缩矢量图形 特点: (1)使用xml格式来定义图形: (2)用来定义web上的使用的矢量图: (3)改变图像尺寸,图片质量不 ...