路径方案数

[题目描述]

给一张无向图,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. 前端PHP入门-020-重点日期函数之获取时期时间信息函数

    你需要知道关于时间的几个概念: 时区/世界时/unix时间戳 1.时区 这个概念,之前大家听说过很多.我们来啰嗦两句,我们现实生活中使用的实区,在电脑里面也是一样有规定的. 1884年在华盛顿召开国际 ...

  2. CentOS7,安装Tomcat8.5、JDK1.8,并设置开机启动(Linux CentOS Tomcat、JDK+Tomcat、Tomcat开机自启动)

    1.下载JDK1.8.Tomcat8 http://www.oracle.com/technetwork/java/javase/downloads/jdk8-downloads-2133151.ht ...

  3. CF821 D. Okabe and City 图 最短路

    Link 题意:给出$n*m$大小的地图,已有$k$盏灯亮,人从左上角出发,右下角结束,期间必须走路灯点亮的地方,他可以在任意时刻消耗一枚硬币点亮一行或一列灯,他最多同时点亮一行或一列灯,要想点亮别的 ...

  4. 【CODEVS】1033 蚯蚓的游戏问题

    [算法]网络流-最小费用最大流(费用流) [题解]与方格取数2类似 在S后添加辅助点S_,限流k 每条边不能重复走,限流1 #include<cstdio> #include<alg ...

  5. 【BZOJ】2337: [HNOI2011]XOR和路径 期望+高斯消元

    [题意]给定n个点m条边的带边权无向连通图(有重边和自环),在每个点随机向周围走一步,求1到n的期望路径异或值.n<=100,wi<=10^9. [算法]期望+高斯消元 [题解]首先异或不 ...

  6. Please move or remove them before you can merge

    在使用git pull时,经常会遇到报错: Please move or remove them before you can merge 这是因为本地有修改,与云端别人提交的修改冲突,又没有merg ...

  7. C语言实现栈(顺序存储方式)

    #include <stdio.h> #include <stdlib.h> //提供malloc()原型 #include <stdbool.h> //提供tru ...

  8. ES6基础知识汇总

    1.如何理解ECMAScript6? ECMAScript是什么,ECMASCript的作用 2.新增let关键字 let的用途 3.关键字const const作用,传址赋值 4.解构赋值 解构赋值 ...

  9. htmlunit爬虫工具使用--模拟浏览器发送请求,获取JS动态生成的页面内容

    Htmlunit是一款模拟浏览抓取页面内容的java框架,具有js解析引擎(rhino),可以解析页面的js脚本,得到完整的页面内容,特殊适合于这种非完整页面的站点抓取. 下载地址: https:// ...

  10. Ubuntu 17.10 用 apt 搭建 lamp 环境、安装 phpmyadmin、redis 服务+扩展、mysql 扩展、开启错误提示、配置虚拟主机

    2018-02-24 13:50:30 更新: 个人喜欢相对原生又不太麻烦,所以用 apt 构建环境.不过,最近使用到现在记得出现过了 3 次 apache 或 mysql 服务器无法启动或无法连接的 ...