HDU3191-How many paths are there(次短路的长度及其个数)
oooccc1 is a Software Engineer who has to ride to the work place every Monday through Friday. For a long period, he went to office with the shortest path because he loves to sleep late…Time goes by, he find that he should have some changes as you could see, always riding with the same path is boring.
One day, oooccc1 got an idea! Why could I take another path? Tired at all the tasks he got, he got no time to carry it out. As a best friend of his, you’re going to help him!
Since oooccc1 is now getting up earlier, he is glad to take those paths, which are a little longer than the shortest one. To be precisely, you are going to find all the second shortest paths.
You would be given a directed graph G, together with the start point S which stands for oooccc’1 his house and target point E presents his office. And there is no cycle in the graph. Your task is to tell him how long are these paths and how many there are.
Input
There are some cases. Proceed till the end of file.
The first line of each case is three integers N, M, S, E (3 <= N <= 50, 0 <= S , E <N)
N stands for the nodes in that graph, M stands for the number of edges, S stands for the start point, and E stands for the end point.
Then M lines follows to describe the edges: x y w. x stands for the start point, and y stands for another point, w stands for the length between x and y.
All the nodes are marked from 0 to N-1.
Output
For each case,please output the length and count for those second shortest paths in one line. Separate them with a single space.
Sample Input
3 3 0 2
0 2 5
0 1 4
1 2 2
Sample Output
6 1
题解:题目已经说明题意了;我们可以记录最短路和短路的长度及其次数并不断更新他们。每次更新是无非5种情况:比最小值小,等于最小值,大于最小值小于次小值,等于次小值,大于次小值;
AC代码为:
/*
题意:给你N个点M条有向边,开始点s,终点e,求 s到e的次最短路,输出次最短路的长度和条数
*/
#include<bits/stdc++.h>
using namespace std;
#define MAX 1100
#define INF 999999999
struct edge
{
int from,to,w;
};
vector<edge> edges;
vector<int> G[MAX];
int m,n;
int dis[MAX][2],vis[MAX][2],cnt[MAX][2];
int s,e;
void addedge(int x,int y,int w)
{
edge a={x,y,w};
edges.push_back(a);
G[x].push_back(edges.size()-1);
}
void dijkstra(int x,int y)
{
for(int i=0;i<=n;i++)
{
dis[i][0]=dis[i][1]=INF;
cnt[i][0]=cnt[i][1]=INF;
}
dis[x][0]=0;
cnt[x][0]=1;
memset(vis,0,sizeof(vis));
for(int i=1;i<=n*2;i++)
{
int min=INF,u=-1,flag;
for(int j=0;j<n;j++)
{
if(!vis[j][0]&&min>dis[j][0])
{
min=dis[j][0];
flag=0;
u=j;
}
else if(!vis[j][1]&&min>dis[j][1])
{
min=dis[j][1];
flag=1;
u=j;
}
}
if(u==-1) break;
vis[u][flag]=1;
for(int j=0;j<G[u].size();j++)
{
edge v=edges[G[u][j]];
if(min+v.w<dis[v.to][0])
{
dis[v.to][1]=dis[v.to][0];
cnt[v.to][1]=cnt[v.to][0];
dis[v.to][0]=min+v.w;
cnt[v.to][0]=cnt[u][flag];
}
else if(min+v.w==dis[v.to][0]) cnt[v.to][0]+=cnt[u][flag];
else if(min+v.w==dis[v.to][1]) cnt[v.to][1]+=cnt[u][flag];
else if(min+v.w<dis[v.to][1])
{
dis[v.to][1]=min+v.w;
cnt[v.to][1]=cnt[u][flag];
}
}
}
printf("%d %d\n",dis[e][1],cnt[e][1]);
}
int main()
{
while(scanf("%d %d %d %d",&n,&m,&s,&e)!=EOF)
{
for(int i=0;i<=n;i++) G[i].clear();
edges.clear();
for(int i=1;i<=m;i++)
{
int x,y,w;
scanf("%d %d %d",&x,&y,&w);
addedge(x,y,w);
}
dijkstra(s,e);
}
return 0;
}
HDU3191-How many paths are there(次短路的长度及其个数)的更多相关文章
- hdu 3191 次短路的长度和个数
http://acm.hdu.edu.cn/showproblem.php?pid=3191 求次短路的长度和个数 相关分析在这里http://blog.csdn.net/u012774187/art ...
- COJ 0579 4020求次短路的长度
4020求次短路的长度 难度级别:C: 运行时间限制:1000ms: 运行空间限制:51200KB: 代码长度限制:2000000B 试题描述 在一个地图上共有N个路口(编号分别为1到N),R条道路( ...
- Codeforces Round #303 (Div. 2) E. Paths and Trees 最短路+贪心
题目链接: 题目 E. Paths and Trees time limit per test 3 seconds memory limit per test 256 megabytes inputs ...
- Codeforces 545E. Paths and Trees 最短路
E. Paths and Trees time limit per test: 3 seconds memory limit per test: 256 megabytes input: standa ...
- Codeforces Round #303 (Div. 2)E. Paths and Trees 最短路
E. Paths and Trees time limit per test 3 seconds memory limit per test 256 megabytes input standard ...
- Codeforces 545E. Paths and Trees[最短路+贪心]
[题目大意] 题目将从某点出发的所有最短路方案中,选择边权和最小的最短路方案,称为最短生成树. 题目要求一颗最短生成树,输出总边权和与选取边的编号.[题意分析] 比如下面的数据: 5 5 1 2 2 ...
- POJ 3463 有向图求次短路的长度及其方法数
题目大意: 希望求出走出最短路的方法总数,如果次短路只比最短路小1,那也是可取的 输出总的方法数 这里n个点,每个点有最短和次短两种长度 这里采取的是dijkstra的思想,相当于我们可以不断找到更新 ...
- HDU 6181:Two Paths(次短路)
Two Paths Time Limit: 4000/2000 MS (Java/Others) Memory Limit: 153428/153428 K (Java/Others) Total S ...
- hdu3191+hdu1688(求最短路和次短路条数,模板)
hdu3191题意:求出次短路的长度和条数 #include<iostream> #include<cstdio> #include<cstring> #inclu ...
随机推荐
- linux服务器MySQL数据从磁盘拷贝以及恢复
偶有感触:遇到这个问题,经过一个下午的排查, 终于解决. 故事情节:我的阿里云服务器突然被黑客攻击了,整个系统down了. 找客服,他们排查说usr目录的文件全部丢失.让我重新初始化系统盘.初始化之前 ...
- java编程思想第四版第七章总结
1. 实现类的复用通常有两种方式 组合:在新的类中产生现有类的对象 继承:按照现有类的类型来创造新类 2. 一个特殊的方法toString() 在非基本类型的对象中, 都有toString()方法 当 ...
- 力扣(LeetCode)颠倒二进制位 个人题解
颠倒给定的 32 位无符号整数的二进制位. 示例 1: 输入: 00000010100101000001111010011100 输出: 0011100101111000001010010100000 ...
- 从壹开始 [ Design Pattern ] 之二 ║ 单例模式 与 Singleton
前言 这一篇来源我的公众号,如果你没看过,正好直接看看,如果看过了也可以再看看,我稍微修改了一些内容,今天讲解的内容如下: 一.什么是单例模式 [单例模式],英文名称:Singleton Patter ...
- web前端面试题总结(html、css)
1.对 WEB 标准以及 W3C 的理解与认识? 参考: 标签闭合.标签小写.不乱嵌套.提高搜索机器人搜索几率.使用外 链 css 和 js 脚本. 结构行为表现的分离.文件下载与页面速度更快.内容能 ...
- 在idea中使用git
在idea中使用git 1. 在idea中配置git 安装好IntelliJ IDEA后,如果Git安装在默认路径下,那么idea会自动找到git的位置,如果更改了Git的安装位置则需要手动配置下 ...
- 2019-10-29:渗透测试,基础学习,sqlmap文件读取,写入,dnslog盲注作用,mssql手工注入,笔记
sqlmap参数--file-read,从数据库服务器中读取文件--file-write,--file-dest,把文件上传到数据库服务器中 dnslog平台的学习和它在盲注中的应用1,判断注入点2, ...
- 【NHOI2018】扫雷完成图
[题目描述] 扫雷游戏完成后会显示一幅图,图中标示了每个格子的地雷情况.现在,一个 n * n 方阵中有 k 个地雷,请你输出它的扫雷完成图. [输入数据] 输入共 k+1 行: 第 1 行为 2 个 ...
- 使用laravel快速构建vuepress管理器
使用laravel快速构建vuepress管理器 介绍 刚刚学了下laravel感觉很方便,最近也在用vuepress做个人博客,但是感觉每次写文章管理文章不是特别方便,就使用laravel写了这个v ...
- nginx实现内网服务唯一端口外网映射
2.1 内网服务唯一端口外网映射 (一) 组网图 (二) 简要说明: 如标题所示,该功能可以实现内网环境下所有服务端口通过nginx的正向代理通过唯一端口映射至 ...