HDU 1688 Sightseeing
题目链接:Sightseeing
题意:求最短路和比最短路长度+1的所有路径条数。
附代码:用数组记录最短和次短路径的长度和条数,一次更新,直到没有边可以更新。
#include <stdio.h>
#include <string.h>
#include <iostream>
#include <vector>
using namespace std;
#define maxn 1010 struct Node {
int to, val;
Node(int to, int val) {
this->to = to;
this->val = val;
}
};// 保存每个点的所有边及其权值 vector<Node> edge[maxn]; int step[maxn][2]; //bushu[i][j] 表示i点第j短路的长度
int cnt[maxn][2]; // cnt[i][j]表示i点第j短路的条数 int main() {
int t;
scanf("%d", &t);
while(t--) {
int n, m;
scanf("%d%d", &n, &m); for (int i=1; i<=n; ++i) {
edge[i].clear();
step[i][0] = maxn*maxn;
step[i][1] = maxn*maxn;
cnt[i][0] = 0;
cnt[i][1] = 0;
} for (int i=0; i<m; ++i) {
int x, y, z;
scanf("%d%d%d", &x, &y, &z);
edge[x].push_back(Node(y, z));
} int st, ed;
scanf("%d%d", &st, &ed); step[st][0] = 0; // 初始化源点
step[st][1] = maxn*maxn;
cnt[st][0] = 1;
cnt[st][1] = 0; bool ok = false; while(1) {
ok = false;
for (int i=1; i<=n; ++i) {
for (int k=0; k<2; ++k) {
if (cnt[i][k] && i != ed) {
for (int j=0; j<edge[i].size(); ++j) {
int to = edge[i][j].to;
int val = edge[i][j].val; if (step[to][0] > step[i][k] + val) { // 更新最短路
step[to][1] = step[to][0];
cnt[to][1] = cnt[to][0];
step[to][0] = step[i][k] + val;
cnt[to][0] = cnt[i][k];
ok = true;
}
else if (step[to][0] == step[i][k] + val) {
cnt[to][0] += cnt[i][k];
ok = true;
}
else if (step[to][1] > step[i][k] + val) { // 更新次短路
step[to][1] = step[i][k] + val;
cnt[to][1] = cnt[i][k];
ok = true;
}
else if (step[to][1] == step[i][k] + val) {
cnt[to][1] += cnt[i][k];
ok = true;
}
}
cnt[i][k] = 0;
}
}
}
if (ok == false) break;
} // for (int i=1; i<=n; ++i) {
// cout << i << "==" << step[i][0] << " " << cnt[i][0] << " " << step[i][1] << " " << cnt[i][1] << endl;
// }
int ans = cnt[ed][0];
if (step[ed][1] == step[ed][0] + 1) {
ans += cnt[ed][1];
}
printf("%d\n", ans);
}
return 0;
}
/*
HDU 1688
*/ #include <stdio.h>
#include <string.h>
#include <iostream>
#include <vector>
#define maxn 1010
#include <queue>
using namespace std; struct Node {
int v, w;
Node(int v, int w) {
this->v = v;
this->w = w;
}
}; vector <Node> edge[maxn];
int st, ed;
int step[maxn][2];
int cnt[maxn][2];
int mp[maxn][maxn]; void bfs(int st) {
queue<int> que;
que.push(st);
while(!que.empty()) {
int now = que.front();
que.pop();
// cout << now << "-----------------\n";
for (int k=0; k<2; ++k) {
if (cnt[now][k] && now != ed) {
for (int j=0; j<edge[now].size(); ++j) {
int v = edge[now][j].v;
int val = edge[now][j].w;
if (step[v][0] > step[now][k] + val) {
step[v][1] = step[v][0];
cnt[v][1] = cnt[v][0];
step[v][0] = step[now][k] + val;
cnt[v][0] = cnt[now][k];
que.push(v);
// cout << v << "==1==" << step[v][0] << " " << cnt[v][0] << " " << step[v][1] << " " << cnt[v][1] << endl;
}
else if (step[v][0] == step[now][k] + val) {
cnt[v][0] += cnt[now][k];
que.push(v);
// cout << v << "==2==" << step[v][0] << " " << cnt[v][0] << " " << step[v][1] << " " << cnt[v][1] << endl;
}
else if (step[v][1] > step[now][k] + val) {
step[v][1] = step[now][k] + val;
cnt[v][1] = cnt[now][k];
que.push(v);
// cout << v << "==3==" << step[v][0] << " " << cnt[v][0] << " " << step[v][1] << " " << cnt[v][1] << endl;
}
else if (step[v][1] == step[now][k] + val) {
cnt[v][1] += cnt[now][k];
que.push(v);
//cout << v << "==4==" << step[v][0] << " " << cnt[v][0] << " " << step[v][1] << " " << cnt[v][1] << endl;
}
}
cnt[now][k] = 0;
}
}
}
} int main() {
int t;
scanf("%d", &t);
while(t--) {
int n, m;
scanf("%d%d", &n, &m);
for (int i=1; i<=n; ++i) {
edge[i].clear();
step[i][0] = maxn*maxn;
step[i][1] = maxn*maxn;
cnt[i][0] = 0;
cnt[i][1] = 0;
} for (int i=0; i<m; ++i) {
int u, v, w;
scanf("%d%d%d", &u, &v, &w);
edge[u].push_back(Node(v, w));
} scanf("%d%d", &st, &ed);
step[st][0] = 0;
cnt[st][0] = 1; bfs(st);
//
// for (int i=1; i<=n; ++i) {
// cout << i << "==" << step[i][0] << " " << cnt[i][0] << " " << step[i][1] << " " << cnt[i][1] << endl;
// } int ans = cnt[ed][0];
if (step[ed][1] == step[ed][0] + 1) {
ans += cnt[ed][1];
}
printf("%d\n", ans);
}
return 0;
} /*
99
3 3
1 2 1
2 3 1
1 3 1
1 3 */
HDU 1688 Sightseeing的更多相关文章
- HDU 1688 Sightseeing&HDU 3191 How Many Paths Are There(Dijkstra变形求次短路条数)
Sightseeing Time Limit: 3000/1000 MS (Java/Others) Memory Limit: 32768/32768 K (Java/Others) Tota ...
- HDU 1688 Sightseeing 【输出最短路+次短路条数】
题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=1688 题目大意:给n个点,m条有向边.再给出起点s, 终点t.求出s到t的最短路条数+次短路条数. 思 ...
- hdu 1688 Sightseeing (最短路径)
Sightseeing Time Limit: 3000/1000 MS (Java/Others) Memory Limit: 32768/32768 K (Java/Others)Total ...
- 【最短路】HDU 1688 Sightseeing
题目大意 给出一个有向图(可能存在重边),求从\(S\)到\(F\)最短路的条数,如果次短路的长度仅比最短路的长度多1,那么再加上次短路的条数. 输入格式 第一行是数据组数\(T\). 对于魅族数据, ...
- poj 3463/hdu 1688 求次短路和最短路个数
http://poj.org/problem?id=3463 http://acm.hdu.edu.cn/showproblem.php?pid=1688 求出最短路的条数比最短路大1的次短路的条数和 ...
- 【HDOJ】1688 Sightseeing
Dijkstra求解次短路径,使用cnt和dis数组记录最小.次小的个数和长度.重写更新操作. /* 1688 */ #include <iostream> #include <st ...
- 【转载】图论 500题——主要为hdu/poj/zoj
转自——http://blog.csdn.net/qwe20060514/article/details/8112550 =============================以下是最小生成树+并 ...
- hdu图论题目分类
=============================以下是最小生成树+并查集====================================== [HDU] 1213 How Many ...
- HDU图论题单
=============================以下是最小生成树+并查集====================================== [HDU] 1213 How Many ...
随机推荐
- iOS - Swift Set 集合
前言 Set:集合 public struct Set<Element : Hashable> : Hashable, CollectionType, ArrayLiteralConver ...
- 美团网基于机器学习方法的POI品类推荐算法
美团网基于机器学习方法的POI品类推荐算法 前言 在美团商家数据中心(MDC),有超过100w的已校准审核的POI数据(我们一般将商家标示为POI,POI基础信息包括:门店名称.品类.电话.地址.坐标 ...
- oracle 10g正则表达式 REGEXP_LIKE 用法
ORACLE中的支持正则表达式的函数主要有下面四个:1,REGEXP_LIKE :与LIKE的功能相似2,REGEXP_INSTR :与INSTR的功能相似3,REGEXP_SUBSTR :与SUBS ...
- python的最最最最最基本语法(3)
模块:在Python中,一个.py文件就称之为一个模块(Module). 为了避免模块名冲突,Python又引入了按目录来组织模块的方法,称为包(Package).例如两个名不hello.py的模块分 ...
- control file sequential read 等待事件
可能的原因 control file sequential read Reading from the control file. This happens in many cases. For ex ...
- 上传本地文件到HDFS
源代码: import java.io.IOException; import org.apache.hadoop.conf.Configuration; import org.apache.hado ...
- Oracle数据库和DB2数据库分页SQL的区别举例
--------------------------ORACLE数据库分页SQL举例------------------------------------------------ SELECT * ...
- 如何设置session过期时间为30分钟
今天在我的微博(Laruence)上发出一个问题: 我在面试的时候, 经常会问一个问题: “如何设置一个30分钟过期的Session?”, 大家不要觉得看似简单, 这里面包含的知识挺多, 特别适合考察 ...
- dom jaxp详解
转自 http://blog.csdn.net/java958199586/article/details/7277904 一.XML解析技术概述 1.XML解析方式分为两种:dom和sax (1)d ...
- angular-file-upload 中文API
github地址: https://github.com/nervgh/angular-file-upload Directives(指令) nv-file-drop <!-- 最少配置 --& ...