您的位置:首页 > 其它

求最短路即次短路模板,一条边可以重复走的HDU6181

2017-08-25 13:56 274 查看
#include<stdio.h>
#include<string.h>
#include<stdlib.h>
#include<math.h>
#include<iostream>
#include<algorithm>
#include<vector>
#include<queue>
#define MAXSIZE 100010
#define INF 1e18
#define LL long long

using namespace std;

//int ans,n,k,a[MAXSIZE],dist1[MAXSIZE],dist2[MAXSIZE],vis[MAXSIZE];
int n, k, a[MAXSIZE];
LL ans, dist1[MAXSIZE], dist2[MAXSIZE];
bool vis[MAXSIZE];
typedef pair<LL, int>p;//p.second储存节点:u,p.frist储存s->u的当前最短距离

struct node
{
int u;
int v;
LL w;
int next;
}G[MAXSIZE * 2];

void Add(int u,int v,LL w)
{
G[k].u=u;
G[k].v=v;
G[k].w=w;
G[k].next=a[u];
a[u]=k++;
}

void bfs()
{
priority_queue<p,vector<p>,greater<p> > Q;
dist1[1]=0;
Q.push(p(0,1));
while(!Q.empty())//可以发现这里没有vis数组,
{
p k=Q.top();
Q.pop();
int u=k.second;
LL d=k.first;
if(dist2[u] < d) //小优化:如果取出的不是最短距离就不再向下进行
continue;
for(int i=a[u];i!=-1;i=G[i].next)
{
int v=G[i].v;
LL d2=d+G[i].w;
if(dist1[v] > d2) //更新最短路
{
swap(dist1[v],d2);
Q.push(p(dist1[v],v));
}
if(dist2[v] >= d2 && dist1[v]<=d2)//更新次短路
{
dist2[v]=d2;
Q.push(p(dist2[v],v));
}
}
}
ans=dist2
;
}

void Init()
{
for(int i=0;i<MAXSIZE;i++)
{
dist1[i]=INF;
dist2[i]=INF;
vis[i] = false;
a[i]=-1;
}
k=1;
}

int main()
{
int T,u,v,m;
LL w;
scanf("%d",&T);
while(T--)
{
scanf("%d%d",&n,&m);
Init();
while(m--)
{
scanf("%d%d%lld",&u,&v,&w);
Add(u,v,w);
Add(v,u,w);
}
bfs();
printf("%lld\n", ans);
}
return 0;
}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: