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 ...
随机推荐
- CodeForces 214B Hometask
本题求n个数组成的大数,要求是2,3,5的倍数. 因为是2 和5 的倍数,所以个位为 0:所以若n个数中没有0,直接输出-1: 难点就是要求为3 的倍数. 因为若某个数为3的倍数,则其各位数的和必然是 ...
- 类加载器子系统——JVM之四
一.类加载器基本概念 顾名思义,类加载器(class loader)用来加载 Java 类到 Java 虚拟机中.一般来说,Java 虚拟机使用 Java 类的方式如下:Java 源程序(.java ...
- 抛弃QP
随着软件的慢慢进行发现QP根本无法建立多个实例,也就是无法在多个任务中同时使用QP的事件回调 架构,这点同libevent不同,最终决定放弃之,乖乖的用freeRTOS多任务方案,workin ...
- USB mass storage协议
这一节主要把在实现“linux模拟U盘功能”过程中的一些调试过程记录下来,并加以解析. 一.背景知识 1.USB Mass Storage类规范概述 USB 组织在univers ...
- 红外遥控系统原理及单片机软件解码程序,我的编写经历(C版本)
应该说现在每一块开发板都带有红外模块,并且大都配置了相应的程序.但其实自己动手写解码程序,更能锻炼自己所学,且不谈程序写的如何,这个过程中肯定是受益良多的.现在我就把我花一下午写出的解码程序与大家分享 ...
- Response JSON数据返回
简述: 在servlet填充Response的时候,做JSON格式的数据转换 使用的类是net.sf.json.JSONObject,传入response对象和返回的显示类,修改response,返回 ...
- 12款最佳Linux命令行终端工具
12款最佳Linux命令行终端工具 如果你跟我一样,整天要花大量的时间使用Linux命令行,而且正在寻找一些可替代系统自带的老旧且乏味的终端软件,那你真是找对了文章.我这里搜集了一些非常有趣的终端软件 ...
- 从Linux终端管理进程:10个你必须知道的命令
从Linux终端管理进程:10个你必须知道的命令 Linux终端有一系列有用的命令.它们可以显示正在运行的进程.杀死进程和改变进程的优先级.本文列举了一些经典传统的命令和一些有用新颖的命令.本文提到的 ...
- android开发的问题集(二)
(1)子线程对UI线程操作的简便方法 子线程方法用 Looper.prepare(); 结束时候用 Looper.loop();
- 经典CSS颜色混合模式
转自:http://www.webhek.com/css-blend-mode/ 注意:只有使用最新版的谷歌浏览器.火狐浏览器,才能正确的显示本文中的演示. Photoshop里最没有用处的一种功能— ...