题目链接: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的更多相关文章

  1. 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 ...

  2. HDU 1688 Sightseeing 【输出最短路+次短路条数】

    题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=1688 题目大意:给n个点,m条有向边.再给出起点s, 终点t.求出s到t的最短路条数+次短路条数. 思 ...

  3. hdu 1688 Sightseeing (最短路径)

    Sightseeing Time Limit: 3000/1000 MS (Java/Others)    Memory Limit: 32768/32768 K (Java/Others)Total ...

  4. 【最短路】HDU 1688 Sightseeing

    题目大意 给出一个有向图(可能存在重边),求从\(S\)到\(F\)最短路的条数,如果次短路的长度仅比最短路的长度多1,那么再加上次短路的条数. 输入格式 第一行是数据组数\(T\). 对于魅族数据, ...

  5. poj 3463/hdu 1688 求次短路和最短路个数

    http://poj.org/problem?id=3463 http://acm.hdu.edu.cn/showproblem.php?pid=1688 求出最短路的条数比最短路大1的次短路的条数和 ...

  6. 【HDOJ】1688 Sightseeing

    Dijkstra求解次短路径,使用cnt和dis数组记录最小.次小的个数和长度.重写更新操作. /* 1688 */ #include <iostream> #include <st ...

  7. 【转载】图论 500题——主要为hdu/poj/zoj

    转自——http://blog.csdn.net/qwe20060514/article/details/8112550 =============================以下是最小生成树+并 ...

  8. hdu图论题目分类

    =============================以下是最小生成树+并查集====================================== [HDU] 1213 How Many ...

  9. HDU图论题单

    =============================以下是最小生成树+并查集====================================== [HDU] 1213 How Many ...

随机推荐

  1. Tomcat配置虚拟目录

    在Tomcat7版本下,配置虚拟路径修改以下两个文件:     1.server.xml     打开Tomcat目录下的/conf/server.xml文件,在Host之前加入下面红色部分的内容. ...

  2. [转载] google mock CheatSheet

    原文: https://code.google.com/p/googlemock/wiki/CheatSheet Defining a Mock Class Mocking a Normal Clas ...

  3. JavaWeb学习总结(七)—HttpServletRequest

    一.Request概述 request是Servlet.service()方法的一个参数,类型为javax.servlet.http.HttpServletRequest.在客户端发出每个请求时,服务 ...

  4. VNC的安装与配置

    一,安装tigervnc-server VNC软件包 [root@localhost ~]# yum install tigervnc-server 设置开机自启动 [root@localhost ~ ...

  5. Android布局_布局概述和LinearLayout布局

    一.布局概述: 布局为UI提供了一个可视化的结构,比如对于一个activity或者app widget的UI,你可以用两种方式声明布局: 在XML中声明UI元素 在运行时实例化布局元素(在java代码 ...

  6. aliyun CentOS6.5 上 svn 安装笔记

    为了方便管理自己的一些学习资料.总结等,在CentOS6.5上安装SVN,记录过程如下: 1.1  安装方式  独立服务器  fsfs SVN服务器有2种运行方式:独立安装.SVN+Apache.独立 ...

  7. 转!JNDI 是什么?

    JNDI是 Java 命名与目录接口(Java Naming and Directory Interface),在J2EE规范中是重要的规范之一,不少专家认为,没有透彻理解JNDI的意义和作用,就没有 ...

  8. Hbase之删除数据

    import org.apache.hadoop.conf.Configuration; import org.apache.hadoop.hbase.HBaseConfiguration; impo ...

  9. 让你的linux操作系统更加安全【转】

    BIOS安全 记着要在BIOS设置中设定一个BIOS密码,不接收软盘启动.这样可以阻止不怀好意的人用专门的启动盘启动你的Linux系统,并避免别人更改BIOS设置,如更改软盘启动设置或不弹出密码框直接 ...

  10. LocalStorage在Chrome里的实现

    前段时间我们在实现CanTK-Runtime时,也曾在V8基础上模拟过浏览器的LocaleStorage功能,其实现非常简单:每个domain的数据使用的单独文件存储,因为同一时间只有一个游戏运行,所 ...