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(求最短路和次短路条数,模板)的更多相关文章

  1. POJ 3463 最(次)短路条数

    Sightseeing Time Limit: 2000MS   Memory Limit: 65536K Total Submissions: 9497   Accepted: 3340 Descr ...

  2. HDU3191 【输出次短路条数】

    题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=3191 How Many Paths Are There Time Limit: 2000/1000 M ...

  3. hdu1688(dijkstra求最短路和次短路)

    题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=1688 题意:第k短路,这里要求的是第1短路(即最短路),第2短路(即次短路),以及路径条数,最后如果最 ...

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

  5. COJ 0579 4020求次短路的长度

    4020求次短路的长度 难度级别:C: 运行时间限制:1000ms: 运行空间限制:51200KB: 代码长度限制:2000000B 试题描述 在一个地图上共有N个路口(编号分别为1到N),R条道路( ...

  6. spfa求次短路

    思路:先算出每个点到1的最短路d1[i],记录下路径,然后枚举最短路上的边 删掉之后再求一遍最短路,那么这时的最短路就可能是答案. 但是这个做法是错误的,可以被卡掉. 比如根据下面的例题生成的一个数据 ...

  7. 图-用DFS求连通块- UVa 1103和用BFS求最短路-UVa816。

    这道题目甚长, 代码也是甚长, 但是思路却不是太难.然而有好多代码实现的细节, 确是十分的巧妙. 对代码阅读能力, 代码理解能力, 代码实现能力, 代码实现技巧, DFS方法都大有裨益, 敬请有兴趣者 ...

  8. POJ 2251 Dungeon Master --- 三维BFS(用BFS求最短路)

    POJ 2251 题目大意: 给出一三维空间的地牢,要求求出由字符'S'到字符'E'的最短路径,移动方向可以是上,下,左,右,前,后,六个方向,每移动一次就耗费一分钟,要求输出最快的走出时间.不同L层 ...

  9. HDU 3416 Marriage Match IV (求最短路的条数,最大流)

    Marriage Match IV 题目链接: http://acm.hust.edu.cn/vjudge/contest/122685#problem/Q Description Do not si ...

随机推荐

  1. Redis 集群_主从配置_哨兵模式

    首先:slaveof 可以在[从]服务器启动一个service服务,直接将[从]服务器定义为[从Redis] redis-server --slaveof <master-ip> < ...

  2. 微信app支付

    http://www.bubuko.com/infodetail-1062014.html 要完成手机APP跳转到微信的APP进行微信支付,需要进行如下操作: 1.先去微信的开放平台(http://o ...

  3. 【Oracle 】tablespace 表空间创建和管理

    1.表空间的概述 1. 表空间是数据库的逻辑组成部分. 2. 从物理上讲,数据库数据存放在数据文件中: 3. 从逻辑上讲,数据库是存放在表空间中,表空间由一个或者多个数据文件组成. 2.oracle的 ...

  4. 【JQuery】事件冒泡及使用jQuery阻止

    (1)什么是事件起泡 首先你要明白一点,当一个事件发生的时候,该事件总是有一个事件源,即引发这个事件的对象,一个事件不能凭空产生,这就是事件的发生. 当事件发生后,这个事件就要开始传播.为什么要传播呢 ...

  5. codesmith连接postgresql修复bug

    转:CodeSmith7代码生成器针对PostgreSQL数据库无法使用的Bug修复全过程 我自己又修改过,完整的PostgreSQLSchemaProvider.cs文件如下 using Npgsq ...

  6. hibernate的findByExample 外键参数查询解决方案

    用了这么长时间的hibernate/spring,如果不是今天用的findByExample方法到现在还不知道findByExample的机制.惭愧 Class User{String usernam ...

  7. 什么是Web缓存控制(基于HTTP头域)

    这是一篇转载的知识性的文档,主要目的是为了让Web缓存相关概念更容易被开发者理解并应用于实际的应用环境中.为了简要起见,某些实现方面的细节被简化或省略了.如果你更关心细节实现则完全不必耐心看完本文,后 ...

  8. LINQ中in的实现方法-LINQ To Entities如何实现查询 select * from tableA where id in (1,2,3,4)

    如果用in是字符串类型无问题,可以直接这样用 ).Where(entity => urls.Contains((entity.NavigateUrl == null ? "" ...

  9. .net framework多个版本在IIS服务器上时应注意-重新注册IIS-错误Server Application Unavailable

    今天客户一个附件上传的应用程序报错,服务器安装了.net 4.0 framework(还有1.0和2.0版本),因为有网站程序需要用到2.0,配置好站点后,附件程序是用的2.0,Mail程序选择版本为 ...

  10. eclipse 开发 spring 、 springboot项目调试时一直跳转到 SilentExitExceptionHandler.exitCurrentThread 方法

    不想让 eclipse 调试时一直跳转到该方法 解决方法: Eclipse->[Preferences]->[Java]->[Debug]:去掉[Suspend execution ...