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 ...
随机推荐
- 保存会话数据——cookie学习
Cookie是客户端技术,程序把每个用户的数据以cookie的形式写给用户各自的浏览器.当用户使用浏览器再去访问服务器中的web资源时,就会带着各自的数据去.这样,web资源处理的就是用户各自的数据了 ...
- iOS - Swift NSDate 时间
前言 NSDate public class NSDate : NSObject, NSCopying, NSSecureCoding NSDate 用来表示公历的 GMT 时间(格林威治时间).是独 ...
- 关于Java控制台输入输出乱码问题
产生原因:因为这个开源项目的默认字符编码为UTF-8,所以我的控制台的字符编码也自动变成了UTF-8,而键盘的输入流的默认格式是GBK格式,这样就造成了在GBK转UTF-8的过程中产生的奇数乱码错误( ...
- Spring JDBC主从数据库配置
通过昨天学习的自定义配置注释的知识,探索了解一下web主从数据库的配置: 背景:主从数据库:主要是数据上的读写分离: 数据库的读写分离的好处? 1. 将读操作和写操作分离到不同的数据库上,避免主服务器 ...
- Python学习笔记17—Tornado
实例 #!/usr/bin/env Python #coding:utf-8 import tornado.httpserver import tornado.ioloop import tornad ...
- uva 11728 Alternate Task
vjudge 上题目链接:uva 11728 其实是个数论水题,直接打表就行: #include<cstdio> #include<algorithm> using names ...
- C++——友元、异常和其他
一.友元 类并非只能拥有友元函数,也可以将类作为友元.在这种情况下,友元类的所有方法都可以访问原始类的私有成员和保护成员.另外,也可以做更严格的限制,只将特定的成员函数指定为另一个类的友元.哪些函数. ...
- 配置Linux任务计划
Linux有三种计划任务: at:指定一个时间执行一个任务 (适用一个或多个任务,执行一次后就不用) cron:根据一个时间表自动执行任务 (使用一个或多个任务,周期性执行) 系统级别的计划任务及其扩 ...
- JAVA EE 第一阶段项目问题
一: 乱码 原因: 由于同组的其他同学的myeclipse默认的编码方式是GBK,而我的默认的是UTF-8.所以当我使用svn把其他同学提交到组长那里去的代码下载下来的时候,就全乱码了! 解决问题: ...
- kafka常用操作命令
1.启动Kafka,其中">>/dev/null"表示将日志信息输出到"黑洞",其中"2>&1"表示将错误信息和前 ...