B - Flowery Trails Gym - 100783B 堆优化最短路 单源到各个点最短路
2017-06-07 18:56
549 查看
题意:
计算 1 和 n 两点间最短路的路径和的两倍
题解:
1 计算最短路
2 枚举没一条边到两端的距离加上本身长度,判断是等于最短路长度
3 若是的,那么这条边可以当做最短路的一条边
下面是堆优化最短路(源点到各个点的最短路):
#include<queue>
#include<vector>
#include<stdio.h>
#include<string.h>
#include<algorithm>
using namespace std;
typedef long long ll;
const int INF=0x3f3f3f3f3f;
const int maxn=10000+5;
struct Edge
{
int from, to, dist;
Edge(){}
Edge(int u, int v, int d) :from(u), to(v), dist(d){}
};
struct HeapNode
{
int d, u;
HeapNode(int x, int y) :d(x), u(y){}
bool operator < (const HeapNode& rhs) const{
return d > rhs.d;
}
};
struct Dijkstra
{
int n, m;
vector<Edge> edges;
vector<int> G[maxn];
bool done[maxn];
int d[maxn];
int p[maxn];
void init(int n)
{
this->n = n;
for (int i = 0; i < n; i++) G[i].clear();
edges.clear();
}
void AddEdges(int from, int to, int dist)
{
edges.push_back(Edge(from,to,dist));
m = edges.size();
G[from].push_back((m - 1));
}
void dijkstra(int s)
{
priority_queue<HeapNode> Q;
for (int i = 0; i < n; i++) d[i] = INF;
d[s] = 0;
memset(done, 0, sizeof(done));
Q.push(HeapNode(0,s));
while (!Q.empty())
{
HeapNode x = Q.top(); Q.pop();
int u = x.u;
if (done[u]) continue;
done[u] = true;
for (int i = 0; i < G[u].size(); i++)
{
Edge& e = edges[G[u][i]];
if (d[e.to] > d[u] + e.dist)
{
d[e.to] = d[u] + e.dist;
p[e.to] = e.from;
Q.push(HeapNode(d[e.to],e.to));
}
}
}
}
}t[2];
int n,m;
Edge a[250005];
int main()
{
//freopen("input.txt","r",stdin);
while(~scanf("%d%d",&n,&m))
{
t[0].init(n); t[1].init(n);
for(int i=0;i<m;i++)
{
int u,v,w;
scanf("%d%d%d",&u,&v,&w);
t[0].AddEdges(u,v,w); t[0].AddEdges(v,u,w);
t[1].AddEdges(u,v,w); t[1].AddEdges(v,u,w);
a[i].from=u; a[i].to=v; a[i].dist=w;
}
t[0].dijkstra(0);
t[1].dijkstra(n-1);
ll value=t[0].d[n-1];
ll ans=0;
for(int i=0;i<m;i++)
{
int u=a[i].from,v=a[i].to,w=a[i].dist;
if((t[0].d[u]+t[1].d[v]+w==value)||(t[0].d[v]+t[1].d[u]+w==value))
ans+=w;
}
printf("%lld\n",ans*2);
}
return 0;
}
相关文章推荐
- B - Flowery Trails Gym - 100783B (最短路 Dijkstra优先对列优化)
- aoj-2249 Road Construction 单源最短路dijkstra+堆优化(模板)
- HDU 2544 最短路(单源最短路 dijkstra / floyd / dijkstra(堆优化)/dijkstra+邻接链表+堆优化)
- 战争和物流,白书P330LA4080(dijkstra,单源最短路树优化)
- 单源最短路之spfa算法代码(bellman-ford算法的队列优化)
- 最短路练习10/poj/1511 Invitation Cards ,(两次spfa),(单源最短路,优先队列优化的Dijkstra)
- POJ 1511 Invitation Cards(单源最短路,优先队列优化的Dijkstra)
- 【codeforce Gym 100570B】【最短路SPFA】 ShortestPath Query 【询问单源最短路径,每条边有一个颜色,要求路径上相邻边的颜色不能相同】
- 基于邻接矩阵的有回溯最小堆优化的单源最短路Dijkstra算法
- Silver Cow Party SPFA+SLF优化 单源起点终点最短路
- 基于邻接表的有回溯最小堆优化的单源最短路Dijkstra算法
- 最短路模板(Dijkstra & Dijkstra算法+堆优化 & bellman_ford & 单源最短路SPFA)
- Dijkstra求单源最短路模板
- 洛谷P3371-【模板】单源最短路【SPFA】
- 单源最短路(Dijkstra算法) 详细介绍
- POJ 1125 单源最短路 dijkstra的算法初步探索
- FZU_2195_检查站点(单源最短路)
- hdu1874 畅通工程续(Dijkstra算法,单源最短路)
- 最短路,前缀和优化连边,Dijkstra(UESTC 482,Charitable Exchange)
- 最短路dijkstra堆优化