hdu3191+hdu1688(求最短路和次短路条数,模板)
hdu3191题意:求出次短路的长度和条数
#include<iostream>
#include<cstdio>
#include<cstring>
#include<queue>
#include<vector>
using namespace std;
const int MAXN=55;
const int inf=1<<30;
struct Edge{
int v,w;
};
vector<Edge>vet[MAXN];
struct Node{
int v,dist;
int mark;//标记,1为最短路,2为次短路;
bool operator < (const Node &p) const {
if(p.dist!=dist)
return p.dist<dist; return p.v<v;//这儿如果不按顶点的大小排序,就wa了。
}
};
int n,m,s,e;
int dist[MAXN][3];
int dp[MAXN][3];
bool visited[MAXN][3];
//dp[i][1]表示到达点i最短的路有多少条,dp[i][2]表示次短的条数
//dist[i][1]表示到达点i最短路的长度,dist[i][2]表示次短路的长度
/*
用v去松驰u时有四种情况 (设当前dist[v][cas])
情况1:dist[v][cas]+w(v,u)<dist[u][1],找到一个更短的距离,则把原来最短的距离作为次短的距离,同时更新最短的.即
dist[u][2]=dist[u][1]
dist[u][1]=dist[v][cas]+w(v,u);
dp[u][2]=dp[u][1]
dp[u][1]=dp[v][cas],
把Node(dist[u][1],u,1)和Node(dist[u][2],u,2)放入队列
情况2:dist[v][cas]+w(v,u)==dist[u][1],找到一条新的相同距离的最短路,则dp[u][1]+=dp[v][cas],其他不用更新,也不入队
情况3:dist[v][cas]+w(v,u)<dist[u][2],不可以更新最短距离,但可以更新次短的,则更新dist[u][2]和dp[u][2]
dist[u][2]=dist[v][cas]+w(v,u);
dp[u][2]=dp[v][cas];
把Node(dist[u][2],u,2)放入队列
情况4:dist[v][cas]+w(v,u)==dist[u][2] 找到一条新的相同距离的次短路,则dp[u][2]+=dp[v][cas],其他不更新。
*/ void Dijkstra(int start,int end){
for(int i=0;i<n;i++){
dist[i][1]=dist[i][2]=inf;
}
memset(dp,0,sizeof(dp));
memset(visited,false,sizeof(visited));
priority_queue<Node>Q;
Node p,q;
dist[start][1]=0;
dp[start][1]=1;
p.dist=0,p.mark=1,p.v=start;
Q.push(p);
while(!Q.empty()){
p=Q.top();
Q.pop();
if(visited[p.v][p.mark])continue;
//if(dist[p.v][p.mark]!=p.dist)continue;
visited[p.v][p.mark]=true;
for(int i=0;i<vet[p.v].size();i++){
int v=vet[p.v][i].v;
int w=vet[p.v][i].w;
if(!visited[v][1]&&p.dist+w<dist[v][1]){
//可能为次短路
if(dist[v][1]!=inf){
q.v=v,q.dist=dist[v][1],q.mark=2;
dist[v][2]=dist[v][1];
dp[v][2]=dp[v][1];
Q.push(q);
}
dist[v][1]=p.dist+w;
dp[v][1]=dp[p.v][p.mark];
q.v=v,q.dist=dist[v][1],q.mark=1;
Q.push(q);
}else if(!visited[v][1]&&p.dist+w==dist[v][1]){
dp[v][1]+=dp[p.v][p.mark];
}else if(!visited[v][2]&&p.dist+w<dist[v][2]){
dist[v][2]=p.dist+w;
dp[v][2]=dp[p.v][p.mark];
q.dist=dist[v][2],q.v=v,q.mark=2;
Q.push(q);
}else if(!visited[v][2]&&p.dist+w==dist[v][2]){
dp[v][2]+=dp[p.v][p.mark];
}
}
}
} int main(){
while(~scanf("%d%d%d%d",&n,&m,&s,&e)){
for(int i=0;i<n;i++)vet[i].clear();
for(int i=1;i<=m;i++){
int u,v,w;
scanf("%d%d%d",&u,&v,&w);
Edge p;
p.v=v,p.w=w;
vet[u].push_back(p);
}
Dijkstra(s,e);
printf("%d %d\n",dist[e][2],dp[e][2]);
}
return 0;
}
hdu1688
题意:求出最短路的条数比最短路大1的次短路的条数和,基本和上题一样,只是最后多了一个判断是否dist[e][1]+1==dist[e][2];
#include<iostream>
#include<cstdio>
#include<vector>
#include<queue>
using namespace std;
const int MAXN=1000+10;
const int inf=1<<30;
struct Edge{
int v,w;
};
vector<Edge>vet[MAXN];
struct Node{
int v,dist;
int mark;
bool operator < (const Node &p)const {
return p.dist<dist;
}
};
int dist[MAXN][3];
int dp[MAXN][3];
bool visited[MAXN][3];
int n,m,s,e; void Dijkstra(int start,int end){
for(int i=1;i<=n;i++){
dist[i][1]=dist[i][2]=inf;
}
memset(visited,false,sizeof(visited));
memset(dp,0,sizeof(dp));
dist[start][1]=0;
dp[start][1]=1;
priority_queue<Node>Q;
Node p,q;
p.dist=0,p.mark=1,p.v=start;
Q.push(p);
while(!Q.empty()){
p=Q.top();
Q.pop();
if(visited[p.v][p.mark])continue;
visited[p.v][p.mark]=true;
for(int i=0;i<vet[p.v].size();i++){
int v=vet[p.v][i].v;
int w=vet[p.v][i].w;
if(!visited[v][1]&&p.dist+w<dist[v][1]){
if(dist[v][1]!=inf){
dist[v][2]=dist[v][1];
dp[v][2]=dp[v][1];
q.v=v,q.dist=dist[v][2],q.mark=2;
Q.push(q);
}
dist[v][1]=p.dist+w;
dp[v][1]=dp[p.v][p.mark];
q.dist=dist[v][1],q.v=v,q.mark=1;
Q.push(q);
}else if(!visited[v][1]&&p.dist+w==dist[v][1]){
dp[v][1]+=dp[p.v][p.mark];
}else if(!visited[v][2]&&p.dist+w<dist[v][2]){
dist[v][2]=p.dist+w;
dp[v][2]=dp[p.v][p.mark];
q.v=v,q.dist=dist[v][2],q.mark=2;
Q.push(q);
}else if(!visited[v][2]&&p.dist+w==dist[v][2]){
dp[v][2]+=dp[p.v][p.mark];
}
}
}
} int main(){
int _case;
scanf("%d",&_case);
while(_case--){
scanf("%d%d",&n,&m);
for(int i=1;i<=n;i++)vet[i].clear();
for(int i=1;i<=m;i++){
int u,v,w;
scanf("%d%d%d",&u,&v,&w);
Edge p;
p.v=v,p.w=w;
vet[u].push_back(p);
}
scanf("%d%d",&s,&e);
Dijkstra(s,e);
if(dist[e][1]+1==dist[e][2]){
printf("%d\n",dp[e][1]+dp[e][2]);
}else
printf("%d\n",dp[e][1]);
}
return 0;
}
hdu3191+hdu1688(求最短路和次短路条数,模板)的更多相关文章
- POJ 3463 最(次)短路条数
Sightseeing Time Limit: 2000MS Memory Limit: 65536K Total Submissions: 9497 Accepted: 3340 Descr ...
- HDU3191 【输出次短路条数】
题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=3191 How Many Paths Are There Time Limit: 2000/1000 M ...
- hdu1688(dijkstra求最短路和次短路)
题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=1688 题意:第k短路,这里要求的是第1短路(即最短路),第2短路(即次短路),以及路径条数,最后如果最 ...
- 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 ...
- COJ 0579 4020求次短路的长度
4020求次短路的长度 难度级别:C: 运行时间限制:1000ms: 运行空间限制:51200KB: 代码长度限制:2000000B 试题描述 在一个地图上共有N个路口(编号分别为1到N),R条道路( ...
- spfa求次短路
思路:先算出每个点到1的最短路d1[i],记录下路径,然后枚举最短路上的边 删掉之后再求一遍最短路,那么这时的最短路就可能是答案. 但是这个做法是错误的,可以被卡掉. 比如根据下面的例题生成的一个数据 ...
- 图-用DFS求连通块- UVa 1103和用BFS求最短路-UVa816。
这道题目甚长, 代码也是甚长, 但是思路却不是太难.然而有好多代码实现的细节, 确是十分的巧妙. 对代码阅读能力, 代码理解能力, 代码实现能力, 代码实现技巧, DFS方法都大有裨益, 敬请有兴趣者 ...
- POJ 2251 Dungeon Master --- 三维BFS(用BFS求最短路)
POJ 2251 题目大意: 给出一三维空间的地牢,要求求出由字符'S'到字符'E'的最短路径,移动方向可以是上,下,左,右,前,后,六个方向,每移动一次就耗费一分钟,要求输出最快的走出时间.不同L层 ...
- HDU 3416 Marriage Match IV (求最短路的条数,最大流)
Marriage Match IV 题目链接: http://acm.hust.edu.cn/vjudge/contest/122685#problem/Q Description Do not si ...
随机推荐
- 【HTML】WWW简介
www 什么是WWW www(world wide web),又称为万维网,或通常称为web,是一个基于超文本方式的信息检索服务工具. WWW的工作模式 C/S结构(client/server结构), ...
- GDataXMLNode:xml解析库
IOS学习:常用第三方库(GDataXMLNode:xml解析库) 解析 XML 通常有两种方式,DOM 和 SAX: DOM解析XML时,读入整个XML文档并构建一个驻留内存的树结构(节点树),通过 ...
- solr开发从查询结果集中获取对象数据
solrJ从查询结果集中获取对象数据. 方案一:自定义转换方式 /** * * SolrDocument与实体类转换 [测试通过] * * @author pudongping * * @param ...
- mysql慢查询日志相关参数
-- mysql慢查询日志相关参数 -- 慢查询日志时间 show variables like "long_query_time"; -- 将时间设置为2s ; -- 是否开启慢 ...
- php开启与关闭错误提示
windows系统开关php错误提示 如果不具备修改php.ini的权限,可以将如下代码加入php文件中: 代码如下 复制代码 ini_set("display_errors", ...
- 如何修改电脑的本地网卡(非笔记本无限网卡)的mac地址
计算机---设备管理器--找到对应的本地网卡---右键属性-----高级----网络地址
- 转 MySQL问题排查工具介绍
原文链接: http://mrchenatu.com/2017/03/24/mysql-tool/ 本总结来自美团内部分享,屏蔽了内部数据与工具 知识准备 索引 索引是存储引擎用于快速找到记录的一种数 ...
- python 爬虫 重复下载 二次请求
在写爬虫的时候,难免会遇到报错,比如 4XX ,5XX,有些可能是网络的原因,或者一些其他的原因,这个时候我们希望程序去做第二次下载, 有一种很low的解决方案,比如是用 try except t ...
- JS charCodeAt在PHP中的等价物(完整的unicode和表情符号兼容性)
我在JS中有一个简单的代码,如果涉及特殊字符,我无法在PHP中复制. 这是JS代码(请参阅JSFiddle输出): var str = "t
- grafana + influxdb + telegraf
grafana + influxdb + telegraf , 构建性能监控平台http://www.cnblogs.com/Scissors/p/5977670.html https://docs. ...