2017 第十场多校训练 HDU 6181 Two Paths 次短路+Dijkstra
2017-08-24 23:24
746 查看
/* 裸的次短路 不断更新v->u的次短路,直到v->u的次短路只比最短路小 */ #include <vector> #include <iostream> #include <stdio.h> #include <queue> using namespace std; #define ll long long #define INF 1e18 #define MAXM 100100 struct edge{int to;ll w;}; typedef pair<ll,int>P; int n,r; ll d[MAXM]; ll d1[MAXM]; vector<edge>G[MAXM]; bool vis[MAXM]; void solve(){ priority_queue<P, vector<P>,greater<P> >que; fill(d+1,d+n+1,INF); fill(d1+1,d1+n+1,INF); d[1]=0; que.push(P(0,1)); while(!que.empty()){ P p=que.top(); que.pop(); int v=p.second; if(d1[v]<p.first)continue; for(int i=0;i<G[v].size();i++){ edge &e=G[v][i]; ll d2=p.first+e.w; if(d[e.to]>d2){ swap(d[e.to],d2); que.push(P(d[e.to],e.to)); } if(d1[e.to]>d2&&d[e.to]<d2){ d1[e.to]=d2; que.push(P(d1[e.to],e.to)); } } } printf("%I64d\n",d1 ); } int main(){ int t; scanf("%d",&t); while(t--){ scanf("%d %d",&n,&r); for(int i=1;i<=n;i++){ G[i].clear(); } int u,v; ll w; while(r--){ scanf("%d %d %I64d",&u,&v,&w); G[u].push_back(edge{v,w}); G[v].push_back(edge{u,w}); } solve(); } return 0; }
一种复杂的做法
#include <bits/stdc++.h>
#define next _next
using namespace std;
typedef long long ll;
const ll inf=0x3f3f3f3f3f3f3f;
const int MAXN=200000+10;
struct Rec{
int num;
ll len;
bool operator < (const Rec &a) const {
return len>a.len;
}
};
int u[MAXN*2],v[MAXN*2];
ll dis[MAXN/2],secondis[MAXN/2],w[MAXN*2];
int first[MAXN/2],next[MAXN*2];
int n,r;
void dijkstra()
{
priority_queue<Rec>que;
for (int i=1;i<n;i++){
dis[i]=inf;
secondis[i]=inf;
}
dis[0]=0;
secondis[0]=inf;
Rec temp;
temp.len=0;
temp.num=0;
que.push(temp);
while (!que.empty())
{
Rec head=que.top();
que.pop();
if (head.len>secondis[head.num]) continue;
int k=first[head.num];
while (k!=-1)
{
ll d=head.len+w[k];
if (dis[v[k]]>d)
{
swap(dis[v[k]],d);
temp.len=dis[v[k]];temp.num=v[k];
que.push(temp);
}
if (dis[v[k]]<d && secondis[v[k]]>d)
{
secondis[v[k]]=d;
temp.len=secondis[v[k]];temp.num=v[k];
que.push(temp);
}
k=next[k];
}
}
}
相关文章推荐
- HDU 6166 && 2017 多校训练:Senior Pan(最短路)
- HDU-2017 多校训练赛10-1011-Two Paths
- 2017 多校训练第十场 HDU 6178 Monkeys 最小点覆盖+树形DP
- [hdu 6181 Two Paths] Dijkstra求次短路
- HDU6181 Two Paths(次短路,路径记录,spfa,2017 HDU多校联赛 第10场)
- 【多校训练】hdu 6181 Two Paths 次短路径 Dijkstra
- HDU --- 6181 Two Paths 2017第十场多校签到题【裸次短路】
- hdu 6181 Two Paths -最短路条数+次短路 - 多校联盟10
- (2017多校训练第二场)HDU - 6055 & POJ - 2002 Regular polygon 哈希
- 2017 多校训练第一场 HDU 6034 Balala Power!
- 2017 多校训练第一场 HDU 6035 Colorful Tree
- 2017 多校训练第三场 HDU 6066 RXD's date
- HDU 6181 Two Paths 次短路
- (2017多校训练第四场)HDU - 6069 Counting Divisors 区间筛
- 【2017多校训练2+计算几何+板】HDU 6055 Regular polygon
- 2017 多校训练第三场 HDU 6060 RXD and dividing
- HDU 6180 && 2017 多校训练:Schedule
- HDU-2017 多校训练赛10-1010-Schedule
- 【极角排序+双指针线性扫】2017多校训练七 HDU 6127 Hard challenge
- 2017 多校训练第二场 HDU 6055 Regular polygon