路径方案数

[题目描述]

给一张无向图,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]

5 6

1 3 2

1 4 2

3 4 3

1 5 12

4 2 34

5 2 24

[输出样例 1]

2

[输入样例 2]

7 8

1 3 1

1 4 1

3 7 1

7 4 1

7 5 1

6 7 1

5 2 1

6 2 1

[输出样例 2]

4

[数据范围]

30%: N<=100,M<=1000

100%: N<=50000,,M<=100000

每条边的长度<=1000


  分析:

  上午考试我是真的不知道在干什么,这个基本的最短路然后重建边再拓扑也没看出来。。。

  spfa以2为起点跑一遍,然后按照要求重建边再跑拓扑即可。但是有一个问题,因为重建边后1的入度可能不为0,那么就反向建边,因为可以保证2的入度一定为0。然后跑拓扑就行了。

  Code:

//It is made by HolseLee on 20th July 2018
//mod
#include<bits/stdc++.h>
using namespace std;
const int N=5e4+;
const int M=2e5+;
const int mod=1e9+;
int n,m,v[N],head[N],size;
int dis[N],dg[N],ans;
bool vis[N],rx[M];
struct Node{
int to,next,val;
}edge[M];
inline int read()
{
char ch=getchar();int num=;bool flag=false;
while(ch<''||ch>''){if(ch=='-')flag=true;ch=getchar();}
while(ch>=''&&ch<=''){num=num*+ch-'';ch=getchar();}
return flag?-num:num;
}
inline void add(int x,int y,int z)
{
edge[++size].to=y;
edge[size].val=z;
edge[size].next=head[x];
head[x]=size;
}
void spfa(int sta)
{
memset(dis,0x7f,sizeof(dis));
memset(vis,false,sizeof(vis));
queue<int>t;t.push(sta);
dis[sta]=;vis[sta]=true;
while(!t.empty()){
int x=t.front();t.pop();vis[x]=false;
for(int i=head[x];i!=-;i=edge[i].next){
int y=edge[i].to;
if(dis[y]>dis[x]+edge[i].val){
dis[y]=dis[x]+edge[i].val;
if(!vis[y])t.push(y),vis[y]=true;
}
}
}
}
void remake()
{
for(int x=;x<=n;x++){
for(int i=head[x];i!=-;i=edge[i].next){
int y=edge[i].to;
if(dis[x]<dis[y]){
rx[i]=true;dg[y]++;
}
}
}
}
void toplogic(int sta)
{
queue<int>t;t.push(sta);
memset(v,,sizeof(v));
v[sta]=;
while(!t.empty()){
int x=t.front();t.pop();
for(int i=head[x];i!=-;i=edge[i].next){
if(rx[i]&&dg[edge[i].to]){
int y=edge[i].to;v[y]=(v[y]+v[x])%mod;--dg[y];
if(dg[y]==)t.push(y);
}
}
}
}
int main()
{
freopen("mod.in","r",stdin);
freopen("mod.out","w",stdout);
n=read();m=read();int x,y,z;
memset(head,-,sizeof(head));
for(int i=;i<=m;i++){
x=read();y=read();z=read();
add(x,y,z);add(y,x,z);}
spfa();remake();toplogic();
printf("%d\n",v[]);
return ;
}

路径方案数 [SPFA,拓扑排序]的更多相关文章

  1. 路径方案数(mod)

    路径方案数(mod) [题目描述] 给一张无向图,n 个点和 m 条边,cyb 在 1 号点,他要去 2 号点, cyb 可以从 a 走到 b,当且仅当a到2的最短路,比b 到2的最短路长. 求 cy ...

  2. ☆ [HDU2157] How many ways?? 「矩阵乘法求路径方案数」

    传送门:>Here< 题意:给出一张有向图,问从点A到点B恰好经过k个点(包括终点)的路径方案数 解题思路 一道矩阵乘法的好题!妙哉~ 话说把矩阵乘法放在图上好神奇,那么跟矩阵唯一有关的就 ...

  3. bzoj1880: [Sdoi2009]Elaxia的路线(spfa,拓扑排序最长路)

    1880: [Sdoi2009]Elaxia的路线 Time Limit: 4 Sec  Memory Limit: 64 MBSubmit: 1944  Solved: 759[Submit][St ...

  4. LGV 引理——二维DAG上 n 点对不相交路径方案数

    文章目录 引入 简介 定义 引理 证明 例题 释疑 扩展 引入 有这样一个问题: 甲和乙在一张网格图上,初始位置 ( x 1 , y 1 ) , ( x 2 , y 2 ) (x_1,y_1),(x_ ...

  5. [BZOJ1880] [Sdoi2009] Elaxia的路线 (SPFA & 拓扑排序)

    Description 最近,Elaxia和w**的关系特别好,他们很想整天在一起,但是大学的学习太紧张了,他们 必须合理地安排两个人在一起的时间.Elaxia和w**每天都要奔波于宿舍和实验室之间, ...

  6. 路径方案数_mod_SPFA_记忆化搜索_C++

    本文含有原创题,涉及版权利益问题,严禁转载,违者追究法律责任 本来是写个 DP 分分钟就 A 了,结果老师要我们写记忆化搜索(无奈脸) 算啦,随手一改又是一个标准的记忆化搜索(目测好像是记忆化搜索容易 ...

  7. bzoj 1880: [Sdoi2009]Elaxia的路线【spfa+拓扑排序】

    有趣啊 先spfa分别求出以s1,t1,s2,t2为起点的最短路,然后把在s1-->t1或者s2-->t2最短路上的边重新建有向图,跑拓扑最长路即可 #include<iostrea ...

  8. BZOJ4383 Pustynia(线段树+拓扑排序)

    线段树优化建图暴力拓扑排序即可.对于已确定的数,拓扑排序时dp,每个节点都尽量取最大值,如果仍与已确定值矛盾则无解.叶子连出的边表示大于号,其余边表示大于等于. #include<iostrea ...

  9. 不相交路径[BZOJ1471] 容斥原理 拓扑排序

    最近学容斥的时候又碰到一道类似的题目,所以想分享一个套路,拿这题来举例 [题目描述] 给出一个\(N(N\leq 150)\)个结点的有向无环简单图.给出4个不同的点\(a,b,c,d\),定义不相交 ...

随机推荐

  1. 3.redis设计与实现--字典

    1.包括三个结构体:字典结构体+哈希表结构体+哈希节点结构体 2.如何解决哈希冲突? 答:redis使用的是链地址法来解决哈希冲突的,每个链表节点有一个next指针,最新加入的节点会放在链表的头部. ...

  2. NOIP 2000 方格取数

    https://www.luogu.org/problem/show?pid=1004 题目描述 设有N*N的方格图(N<=9),我们将其中的某些方格中填入正整数,而其他的方格中则放 人数字0. ...

  3. HDU 2159 FATE (dp)

    题目链接 Problem Description 最近xhd正在玩一款叫做FATE的游戏,为了得到极品装备,xhd在不停的杀怪做任务.久而久之xhd开始对杀怪产生的厌恶感,但又不得不通过杀怪来升完这最 ...

  4. 固定bottom,页面其它可滑动实现方案

    利用flex布局, <html> <body> <div class='container'> <div class='content'></di ...

  5. isolation forest进行异常点检测

    一.简介 孤立森林(Isolation Forest)是另外一种高效的异常检测算法,它和随机森林类似,但每次选择划分属性和划分点(值)时都是随机的,而不是根据信息增益或者基尼指数来选择.在建树过程中, ...

  6. Coursera在线学习---第一节.梯度下降法与正规方程法求解模型参数比较

    一.梯度下降法 优点:即使特征变量的维度n很大,该方法依然很有效 缺点:1)需要选择学习速率α 2)需要多次迭代 二.正规方程法(Normal Equation) 该方法可以一次性求解参数Θ 优点:1 ...

  7. 可能是是最全的Springboot基础视频分享,告别无视频可学

    一头扎进SpringBoot视频教程 SpringBoot入门 2017年-张志君老师-SpringBoot(新增) 欢迎关注我的微信公众号:"Java面试通关手册" 回复关键字& ...

  8. 美团实习Java岗面经,已拿offer

    作者:icysnowgx 链接:https://www.nowcoder.com/discuss/71954?type=2&order=3&pos=10&page=1 来源:牛 ...

  9. You can fail at what you don't want, so you might as well take a chance on doing what you love.

    You can fail at what you don't want, so you might as well take a chance on doing what you love. 做不想做 ...

  10. (转)USB协议简介

    USB协议简介     USB是一种协议总线,即主机与设备之间的通信需要遵循一系列约定.协议内容较多,这里仅作一些简单介绍,深入学习,可参看USB规范(WWW.usb.org).     为了理解协议 ...