路径方案数(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 ...
随机推荐
- wingide 显示中文 及 配色方案
http://lihuipeng.blog.51cto.com/3064864/923231 网上收集的方法: 显示中文: 任意文本编辑器打开:x:\Wing IDE\bin\gtk-bin\etc\ ...
- bzoj2309 CTSC2011 字符串重排
题意: 给定n个字符串S1,S2,S3,...,Sn,把它们排序 设排序结果为Sp1,Sp2,Sp3,...,Spn 现在给定q个任务,每个任务的格式都是"要求在排序结果中Sa恰好在Sb前一 ...
- Django 模板 自定义context_processors
Django版本 1.8.4 为什么要自定义context_processors 在做博客的过程中,在浏览排行,评论排行,标签,文章归档,友情链接等内容每一个显示页面都是要显示的.如果在每一个view ...
- 【运维程序】简单的命令控制器(支持定时命令执行、重复定时任务命令和进程管理,开发这个小程序主要是为了方便管理服务进程)【个人github项目】
一.前言: command-controller 一个运维程序,简单的命令控制器(支持定时命令执行和重复定时命令,开发这个程序主要是为了方便管理服务进程) 本来是要用python做的,但是之前做ffm ...
- Vijos:P1540月亮之眼
描述 吉儿是一家古董店的老板娘,由于她经营有道,小店开得红红火火.昨天,吉儿无意之中得到了散落民间几百年的珍宝—月亮之眼.吉儿深知“月亮之眼”价值连城:它是由许多珍珠相连而成的,工匠们用金线连接珍珠, ...
- 2010浙大:zoj问题
题目描述: 对给定的字符串(只包含'z','o','j'三种字符),判断他是否能AC. 是否AC的规则如下:1. zoj能AC:2. 若字符串形式为xzojx,则也能AC,其中x可以是N个'o' 或者 ...
- 四 akka学习 四种多线程的解决方案
http://blog.csdn.net/chenleixing/article/details/44044243 四种多线程的解决方案
- JS---Math.Random()*10--[0,10)随机变颜色
<!DOCTYPE html> <html> <head lang="en"> <meta charset="UTF-8&quo ...
- Linux系统下如何设置IP地址?
Linux系统下如何设置IP地址?我们可以通过命令设定IP的方法,不过此方法的前提条件是用户需root权限.在linux系统的 /etc/sysconfig/network-script/ifcfg- ...
- android基础复习
http://www.cnblogs.com/aimeng/archive/2012/03/13/2393244.html android体系介绍 http://blog.chinaunix.net/ ...