【dijkstra】【次短路】【fread】hdu6181 Two Paths
2024-08-21 19:39:29
题意:给你一张简单无向图,问你1到n的次短路。注意,可以不是简单路径。
存个次短路板子,原理还是挺简单,直接看代码吧。然后这份代码还是个fread的示例用法。
#include<cstdio>
#include<queue>
#include<algorithm>
#include<cstring>
using namespace std;
const int BUF=60000000;
char Buf[BUF],*buf=Buf;
inline void read(int&a){for(a=0;*buf<48;buf++);while(*buf>47)a=a*10+*buf++-48;}
#define N 100000+10
#define INF 1000000000000000ll
typedef long long ll;
typedef pair<ll, int> Point;
priority_queue<Point,vector<Point>,greater<Point> >Heap;
int n;
ll dist[N],dist2[N];
int e,first[N],nex[N<<1],v[N<<1],w[N<<1];
void AddEdge(int U, int V,int W){
v[++e]=V;
w[e]=W;
nex[e]=first[U];
first[U]=e;
}
int m,T;
int main()
{
int x,y,z;
// freopen("1011.in","r",stdin);
fread(Buf,1,BUF,stdin);
read(T);
for(;T;--T){
read(n); read(m);
e=0;
memset(first,0,sizeof(first));
for(int i=1;i<=m;++i){
read(x); read(y); read(z);
AddEdge(x-1,y-1,z);
AddEdge(y-1,x-1,z);
}
fill(dist,dist+n,INF);
fill(dist2,dist2+n,INF);
dist[0]=0;
Heap.push(Point(0,0));
while(!Heap.empty()){
Point o=Heap.top(); Heap.pop();
int U=o.second;
ll d=o.first;
if(dist2[U]<d){
continue;
}
for(int i=first[U];i;i=nex[i]){
ll d2=d+(ll)w[i];
if(dist[v[i]]>d2){
swap(dist[v[i]],d2);
Heap.push(Point(dist[v[i]],v[i]));
}
if(dist2[v[i]]>d2 && dist[v[i]]<d2){
dist2[v[i]]=d2;
Heap.push(Point(dist2[v[i]],v[i]));
}
}
}
printf("%lld\n",dist2[n-1]);
}
return 0;
}
最新文章
- CorelDRAW x6 X8安装失败解决方法
- Swift-11-协议(Protocols)
- ID3决策树算法原理及C++实现(其中代码转自别人的博客)
- go/wiki/MutexOrChannel Golang并发:选channel还是选锁?
- python 12
- 理解OpenShift(6):集中式日志处理
- 2016 ACM/ICPC亚洲区青岛站现场赛(部分题解)
- 关于dubbo服务超时的讨论
- jenkins 使用smtp2http 邮件服务,扩展灵活的构建通知功能
- MySQL 5.7.16 字符串拆分 ->; 单列变多行记录(转发)
- js模板 arttemplate 让数据与html分离
- Vue 父组件循环使用refs调用子组件方法出现undefined的问题
- html5 js 游戏的一篇博客 貌似不错
- Mac: iTerm2使用
- Application.streamingAssetsPath
- PHP之string之str_shuffle()函数使用
- 深搜———ZOJ 1004:anagrams by stack
- c++ 跳转语句块
- NSCharacter​Set 关于字符串编码
- 【Redis】- 安装为windows服务