cdoj 秋实大哥带我飞 最短路走法 含0权边
//做完这题以后终于理解白书上的边为什么要那样定义了 可以很方便的在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权边的更多相关文章
- UESTC_秋实大哥带我飞 2015 UESTC Training for Graph Theory<Problem B>
B - 秋实大哥带我飞 Time Limit: 300/100MS (Java/Others) Memory Limit: 65535/65535KB (Java/Others) Submit ...
- cdoj 秋实大哥搞算数
地址:http://acm.uestc.edu.cn/#/contest/show/95 题目: N - 秋实大哥搞算数 Time Limit: 3000/1000MS (Java/Others) ...
- cdoj 秋实大哥与战争
首先,显然每个区间的最长连续子区间要么在左孩子里,要么在右孩子里,要么跨越两个孩子.于是我们可以对每个区间维护如下信息ll(left long),rl(rigth long),ml(mid long) ...
- CDOJ 1146 A - 秋实大哥与连锁快餐店 最小生成树 Prim算法 稠密图
题目链接 A - 秋实大哥与连锁快餐店 Time Limit:3000MS Memory Limit:65535KB 64bit IO Format:%lld & %llu S ...
- CDOJ 1070 秋实大哥打游戏 带权并查集
链接 F - 秋实大哥打游戏 Time Limit:1000MS Memory Limit:65535KB 64bit IO Format:%lld & %llu Submit ...
- CDOJ 1069 秋实大哥去打工 单调栈 下标处理
E - 秋实大哥去打工 Time Limit:1000MS Memory Limit:65535KB 64bit IO Format:%lld & %llu Submit St ...
- CDOJ 1061 C - 秋实大哥与战争 STL set 迭代器
题目链接: C - 秋实大哥与战争 Time Limit:1000MS Memory Limit:65535KB 64bit IO Format:%lld & %llu Sub ...
- CDOJ 1060 秋实大哥与快餐店 字典树 水题
题目链接 B - 秋实大哥与快餐店 Time Limit:1000MS Memory Limit:65535KB 64bit IO Format:%lld & %llu Sub ...
- CDOJ 1057 秋实大哥与花 线段树 区间更新+区间查询
链接: I - 秋实大哥与花 Time Limit:1000MS Memory Limit:65535KB 64bit IO Format:%lld & %llu Submit ...
随机推荐
- python核心编程-第三章-个人笔记
1.语句和语法 (1)反斜杠"\"表示语句继续.python良好的编程习惯是一行最后不超过80个字符,一行字符过多时便须用到反斜杠换行继续该语句. PS:在使用小括号.中括号.大括 ...
- java.lang.NoClassDefFoundError: org/apache/commons/io/output/DeferredFileOutputStream(转)
java.lang.NoClassDefFoundError: org/apache/commons/io/output/DeferredFileOutputStream 使用Tomcat的Manag ...
- ZigBee 协议规范
ZigBee协议栈体系结构由应用层.应用汇聚层. 网络层.数据链路层和物理层组成,如下图所示: 图1 ZigBee 协议栈体系的层次结构 应用层定义了各种类型的应用业务,是协议栈的最 ...
- Dynamics CRM 2013 初体验(3):新增加的功能
新系统除了修补系统历史漏洞外当然还会添加些比较有意思的新功能,至于这些新功能是否好用那就得看它是否能经过咱们这些使用者的考验了.Dynamics CRM 2013系统将不再支持Dynamics CRM ...
- Unix/Linux环境C编程入门教程(23) 字符数字那些事儿
1.atoi 包含头文件: #include <stdlib.h> 函数原型: int atoi( const char *str ); 功能:将字符串str转换成一个整数并返回结果.参数 ...
- Java的Git管理工具Gitblit
From:http://www.oschina.net/p/gitblit Gitblit 是一个纯 Java 库用来管理.查看和处理 Git 资料库.相当于 Git 的 Java 管理工具. 下载地 ...
- 蓝桥杯之JAM的计数法
题目描述 Jam是个喜欢标新立异的科学怪人.他不使用阿拉伯数字计数,而是使用小写英文字母计数,他觉得这样做,会使世界更加丰富多彩.在他的计数法中,每个数字的位数都是相同的(使用相同个数的字母),英文字 ...
- ssh伪登陆执行远程主机脚本命令 C程序基于ssh passwordless执行远程主机命令及基于配置文件的验证伪登陆执行命令
1,基于有密码及免秘钥在远程主机上执行命令及脚本 ssh -T ip "CLI or shell.sh"; 2,C程序实现上述功能--基于password-less
- 2.2.2 胸腰差和胸臀差的应用_米人NOONE_新浪博客
2.2.2 胸腰差和胸臀差的应用_米人NOONE_新浪博客 腰差和胸臀差的应用(2009-06-16 19:24:57)转载▼标签:校园 前面已经对这两个概念作了简单的讲解.这两个概 ...
- 实际用户ID,有效用户ID和设置用户ID
摘自http://blog.csdn.net/guosha/article/details/2679334 实际用户ID,有效用户ID和设置用户ID 看UNIX相关的书时经常能遇到这几个概念,但一直没 ...