POJ - 3255 次短路径
2024-10-19 02:23:37
题意:给你无向带权图,求次短路径
题解:加一个次短路的数组,用于距记录源点到此点的次短路长度,注意初始化是源点到自己的次短路是极大值
接着再使用dijkstra算法,它是每次选用现在连上(记录了)的点与其他点的最小权值的边去更新其他所有的点
就是在dij的算法上进行简单的修改,需要修改的是每次最短路更新之后再更新次短路,但是保证更新的次短路大于记录的次短路并小于记录的最短路
#include<cstdio>
#include<cstring>
#include<queue>
#include<vector>
using namespace std;
const int inf=<<;
const int maxn=;
struct Edge
{
int v,val;
Edge(int v,int val):v(v),val(val) {}
bool operator < (const Edge &c)const//改写大顶堆成为小顶堆
{
return val>c.val;
}
};
vector<Edge> vec[maxn];
int dis[maxn],secondis[maxn];//记录第二短路径
void init(int n)
{
for(int i=; i<=n; ++i)
{
vec[i].clear();
}
}
void dijkstraSecond(int n,int s)
{
priority_queue<Edge> pque;
for(int i=; i<=n; ++i)
{
dis[i]=inf;
secondis[i]=inf;//注意初始化
}
//secondis[s]=0;//不能初始化
dis[s]=;
pque.push(Edge(s,));
while(!pque.empty())
{
Edge disE=pque.top();
pque.pop();
if(secondis[disE.v]<disE.val)//注意次短路都失败了才不能加上这条路
continue;
for(int i=; i<vec[disE.v].size(); ++i)
{
Edge endE=vec[disE.v][i];
int disnow=disE.val+endE.val;//注意这儿不能用dis求
if(dis[endE.v]>disnow)//松弛最短路
{
swap(dis[endE.v],disnow);//由于松弛次短路,所以这儿是交换两者
pque.push(Edge(endE.v,dis[endE.v]));
}
if(secondis[endE.v]>disnow&&dis[endE.v]<disnow)//松弛次短路
{
secondis[endE.v]=disnow;
pque.push(Edge(endE.v,secondis[endE.v]));
}
}
}
}
int main()
{
int n,m;
while(~scanf("%d %d",&n,&m))
{
init(n);
while(m--)
{
int u,v,c;
scanf("%d %d %d",&u,&v,&c);
vec[u].push_back(Edge(v,c));
vec[v].push_back(Edge(u,c));
}
dijkstraSecond(n,);
// for(int i=1; i<=n; ++i)
// {
// printf("secondis[i]=%d\n",secondis[i]);
// }
printf("%d\n",secondis[n]);
}
return ;
}
最新文章
- TDR测试原理
- nancy中视图呈现 Html.Partial(RenderPage的替代品)
- ✡ leetcode 169. Majority Element 求出现次数最多的数 --------- java
- 结对编程--基于android平台的黄金点游戏
- HTML5的文档结构和新增标签
- 清北学堂2017NOIP冬令营入学测试P4749 C’s problem(c)
- C#2.0 特性
- Linux的Cgroup
- hdu 4099 Revenge of Fibonacci Trie树与模拟数位加法
- [访问系统] C#计算机信息类ComputerInfo (转载)
- STL——heap的4大操作
- C# Best Practices - Specify Clear Method Parameters
- 手机端viewport的设置规范
- URL vs. HTML 录制模式
- Nubia Z5S 基于官方H207/4.4内核的Mokee4.4.4 RC3.2 (2014.7.31修复呼吸灯(能亮依旧不能呼吸))
- Spring Dynamic DataSource Routing
- IIS网站 由http协议改变为https协议
- sh - 脚本学习 启动/停止/重启/部署jetty crontab
- 安卓开发_WebView设置打开网页缩放问题
- C++ code:剩余串排列
热门文章
- 在nginx启动后,如果我们要操作nginx,要怎么做呢 别增加无谓的上下文切换 异步非阻塞的方式来处理请求 worker的个数为cpu的核数 红黑树
- JavaScript中的原型与原型链
- SpringBoot 配置文件 YML/Profile
- 19.Delete Documents-官方文档摘录
- C++开源库集合
- django+celery 实现定时任务
- shell脚本循环处理文件数据
- web Servlet 3.0 新特性之web模块化编程,web-fragment.xml编写及打jar包
- PHP的pm、pm.max_requests、memory_limit
- Springboot 日志管理配置logback-spring.xml