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 ...
随机推荐
- ReactNative
基于ReactNative实现的博客园手机客户端 去年九月,facebook发布了react-native,将web端的javaScript和react技术扩展到了IOS和Android的原生应用 ...
- Java连接Azure SQL Database
Azure SQL Database是Azure上的数据库PAAS服务,让用户可以快速的创建和使用SQL数据库而不用担心底层的备份,安全,运维,恢复等繁琐的工作,本文简单介绍如何使用Java程序连接到 ...
- Zigbee、WiFi和433MHz无线技术各有特点
Zigbee.WiFi和433MHz无线技术都属于近距离无线通讯技术,并且都使用ISM免执照频段,但它们各具特点. ZigBee的特点是低功耗.高可靠性.强抗干扰性,布网容易,通过无线中继器可以非 ...
- let区别(关于racket和r5rs)
R5RS is the Revised5 Report on the Algorithmic Language Scheme.参考http://www.schemers.org/Documents/S ...
- 三校联考 Day3
三校联考 Day3 大水题 题目描述:给出一个圆及圆上的若干个点,问两个点间的最远距离. solution 按极角排序,按顺序枚举,显然距离最远的点是单调的,线性时间可解出答案. 大包子的束缚 题目描 ...
- 菜鸟必须知道的linux的文件目录结构
Linux文件目录结 / 根目录,所有的目录.文件.设备都在/之下,/就是Linux文件系统的组织者,也是最上级的领导者. /bin bin就是二进制(binary)英文缩写.在一般的系统当中,你都可 ...
- UVA - 10131Is Bigger Smarter?(DAG上的DP)
题目:UVA - 10131Is Bigger Smarter? (DAG) 题目大意:给出一群大象的体重和IQ.要求挑选最多的大象,组成一个序列.严格的体重递增,IQ递减的序列.输出最多的大象数目和 ...
- 警惕:利用Dropbox链接散播的恶意软件
趋势科技近期发现好几起利用热门文档代管服务Dropbox的垃圾邮件.邮件的内嵌链接会下载UPATRE恶意软件变种.UPATRE下面载恶意软件而恶名昭彰,当中包含ZBOT恶意软件.CryptoLocke ...
- golang之interface
一.概述 接口类型是对 "其他类型行为" 的抽象和概况:因为接口类型不会和特定的实现细节绑定在一起:很多面向对象都有类似接口概念,但Golang语言中interface的独特之处在 ...
- C# MySQL数据库的备份 还原 初始化
// 执行创建数据库操作 this.GetExecute(G_Con, "create database if not exists NEWDB"); this.sqlAddres ...