//做完这题以后终于理解白书上的边为什么要那样定义了 可以很方便的在o(1) 时间内找到反向边

解法:先跑一边最短路,然后检查最短路上有没有0权边(dfs就好,但是每条边只能走一次,这里就需要用异或找反向边),最后记忆化搜索一遍(每条边也是只能走一次)

 #include<cstdio>
#include<iostream>
#include<cmath>
#include<algorithm>
#include<cstring>
#include<cstdlib>
#include<queue>
#include<vector>
#include<map>
#include<stack>
#include<string> using namespace std; const int INF=;
const int MOD=; struct Edge{
int from,to,cost;
}; vector <Edge> edges;
vector <int> G[];
bool vis[];
int dis[];
bool inq[];
int f[];
int n,m; void AddEdge(int x,int y,int z){
edges.push_back((Edge){x,y,z});
edges.push_back((Edge){y,x,z});
int sz=edges.size();
G[x].push_back(sz-);
G[y].push_back(sz-);
} void SPFA(){
dis[]=;
memset(inq,,sizeof(inq));
queue<int>q;
q.push();
inq[]=;
while (!q.empty()){
int now=q.front();
int sz=G[now].size();
q.pop();
for (int i=;i<sz;i++){
Edge& e=edges[G[now][i]];
if (dis[e.to]>dis[now]+e.cost){
dis[e.to]=dis[now]+e.cost;
if (!inq[e.to]){
q.push(e.to);
inq[e.to]=;
}
}
}
inq[now]=;
}
} bool check(int now){
if (now==) return ;
bool flag=;
int sz=G[now].size();
for (int i=;i<sz;i++){
Edge& e=edges[G[now][i]];
if (!vis[G[now][i]] && dis[now]==dis[e.to]+e.cost){
vis[G[now][i]]=;
vis[G[now][i]^]=;
if (e.cost==) flag=false;
if (!check(e.to)) flag=false;
}
}
return flag;
} int work(int now){
if (f[now]!=-) return f[now];
f[now]=;
int sz=G[now].size();
for (int i=;i<sz;i++){
Edge& e=edges[G[now][i]];
if (!vis[G[now][i]] && dis[now]==dis[e.to]+e.cost){
vis[G[now][i]]=;
vis[G[now][i]^]=;
f[now]=(f[now]+work(e.to))%MOD;
}
}
return f[now];
} int main(){
scanf("%d%d",&n,&m);
for (int i=;i<=n;i++) dis[i]=INF;
for (int i=;i<m;i++){
int x,y,z;
scanf("%d%d%d",&x,&y,&z);
AddEdge(x,y,z);
}
SPFA();
//printf("%d\n",dis[n]);
memset(vis,,sizeof(vis));
if (!check(n)){
printf("-1\n");
return ;
}
memset(vis,,sizeof(vis));
memset(f,-,sizeof(f));
f[]=;
printf("%d\n",work(n));
return ;
}
/*
4 4
1 2 1
1 3 1
2 4 2
3 4 2 4 4
1 2 0
1 3 1
2 4 99
3 4 99
*/

cdoj 秋实大哥带我飞 最短路走法 含0权边的更多相关文章

  1. UESTC_秋实大哥带我飞 2015 UESTC Training for Graph Theory<Problem B>

    B - 秋实大哥带我飞 Time Limit: 300/100MS (Java/Others)     Memory Limit: 65535/65535KB (Java/Others) Submit ...

  2. cdoj 秋实大哥搞算数

    地址:http://acm.uestc.edu.cn/#/contest/show/95 题目: N - 秋实大哥搞算数 Time Limit: 3000/1000MS (Java/Others)   ...

  3. cdoj 秋实大哥与战争

    首先,显然每个区间的最长连续子区间要么在左孩子里,要么在右孩子里,要么跨越两个孩子.于是我们可以对每个区间维护如下信息ll(left long),rl(rigth long),ml(mid long) ...

  4. CDOJ 1146 A - 秋实大哥与连锁快餐店 最小生成树 Prim算法 稠密图

    题目链接 A - 秋实大哥与连锁快餐店 Time Limit:3000MS     Memory Limit:65535KB     64bit IO Format:%lld & %llu S ...

  5. CDOJ 1070 秋实大哥打游戏 带权并查集

    链接 F - 秋实大哥打游戏 Time Limit:1000MS     Memory Limit:65535KB     64bit IO Format:%lld & %llu Submit ...

  6. CDOJ 1069 秋实大哥去打工 单调栈 下标处理

    E - 秋实大哥去打工 Time Limit:1000MS     Memory Limit:65535KB     64bit IO Format:%lld & %llu Submit St ...

  7. CDOJ 1061 C - 秋实大哥与战争 STL set 迭代器

    题目链接: C - 秋实大哥与战争 Time Limit:1000MS     Memory Limit:65535KB     64bit IO Format:%lld & %llu Sub ...

  8. CDOJ 1060 秋实大哥与快餐店 字典树 水题

    题目链接 B - 秋实大哥与快餐店 Time Limit:1000MS     Memory Limit:65535KB     64bit IO Format:%lld & %llu Sub ...

  9. CDOJ 1057 秋实大哥与花 线段树 区间更新+区间查询

    链接: I - 秋实大哥与花 Time Limit:1000MS     Memory Limit:65535KB     64bit IO Format:%lld & %llu Submit ...

随机推荐

  1. USB Mass Storage协议分析

    目录 简介 指令数据和状态协议 CBW指令格式 CSWCommand Status Wrapper状态格式 SCSI命令集 Format Unit Inquiry MODE SELECT 简介 USB ...

  2. Inno Setup 创建站点,创建虚拟目录

    原文 http://hi.baidu.com/0531_sunmiles/item/ce22554ab7d33d0be9350477 下面的这段代码是用Inno Setup 做安装包的时候创建IIS新 ...

  3. 匿名方法和Lambda表达式

    匿名方法本质上是一传递给委托的代码块,是使用委托的另一种方法. 规则: 1.匿名方法中不能使用跳转语句跳至次匿名方法的外部,反之亦然:匿名方法外部的跳转语句也不能跳转到匿名方法的内部: 2.在匿名方法 ...

  4. Sumsets(3sum问题,枚举d,c二分a+b)

    Sumsets Time Limit: 1000MS   Memory Limit: 65536K Total Submissions: 9997   Accepted: 2736 Descripti ...

  5. Hadoop权威指南学习笔记二

    MapReduce简单介绍 声明:本文是本人基于Hadoop权威指南学习的一些个人理解和笔记,仅供学习參考,有什么不到之处还望指出,一起学习一起进步. 转载请注明:http://blog.csdn.n ...

  6. HDoj-2072-字数

    字数 Time Limit: 1000/1000 MS (Java/Others)    Memory Limit: 32768/32768 K (Java/Others) Total Submiss ...

  7. iOS 键盘挡住UITextField

    iOS经常使用的两个功能:点击屏幕和return隐藏虚拟键盘和解决虚拟键盘挡住UITextField的方法 iOS上面对键盘的处理非常不人性化,所以这些功能都须要自己来实现,  首先是点击return ...

  8. spring boot 中文文档

    https://qbgbook.gitbooks.io/spring-boot-reference-guide-zh/content/VII.%20Spring%20Boot%20CLI/index. ...

  9. CSS 浏览器默认样式

    不要再说div天生就是block——这句话应该换成:浏览器默认样式天生规定了div是block——所以才导致了div是block!是默认样式规定的,不是浏览器的内核规定的. 没有设置block的元素, ...

  10. javascript设计模式——Module

    Module模式是提供公有和私有方法的代码块,有利于封装组织代码,可减少变量及函数名与其它模块的冲突. 推荐阅读: http://www.adequatelygood.com/JavaScript-M ...