mirror of
https://github.com/Kiritow/OJ-Problems-Source.git
synced 2024-03-22 13:11:29 +08:00
Create 3255.cpp
This commit is contained in:
parent
ca540fb153
commit
704dfb7975
101
POJ/3255.cpp
Normal file
101
POJ/3255.cpp
Normal file
|
@ -0,0 +1,101 @@
|
|||
#include <cstdio>
|
||||
#include <cstdlib>
|
||||
#include <cstring>
|
||||
|
||||
#include <vector>
|
||||
#include <queue>
|
||||
#include <list>
|
||||
#include <set>
|
||||
#include <map>
|
||||
|
||||
#include <algorithm>
|
||||
using namespace std;
|
||||
|
||||
#define INF 1e9+7
|
||||
|
||||
#define MAXN 5000
|
||||
#define MAXR 100000
|
||||
|
||||
int N,R;
|
||||
|
||||
struct edge
|
||||
{
|
||||
edge(int To,int Dist):to(To),dist(Dist){}
|
||||
|
||||
int to;
|
||||
int dist;
|
||||
};
|
||||
|
||||
vector<edge> G[MAXN+1];
|
||||
|
||||
/// 最短路: dis[i]=从1号路口出发到i路口的最短距离
|
||||
int dis[MAXN+1];
|
||||
/// 次短路: second_dis[i]=从1号路口出发到i路口的次短距离
|
||||
int second_dis[MAXN+1];
|
||||
|
||||
/// PR.first 为距离, PR.second 为点
|
||||
typedef pair<int,int> PR;
|
||||
|
||||
void solve()
|
||||
{
|
||||
priority_queue< PR,vector<PR>,greater<PR> > bus;
|
||||
fill(dis,dis+N,INF);
|
||||
fill(second_dis,second_dis+N,INF);
|
||||
|
||||
dis[0]=0;
|
||||
bus.push(PR(0,0));
|
||||
|
||||
while(!bus.empty())
|
||||
{
|
||||
PR p=bus.top();
|
||||
bus.pop();
|
||||
|
||||
int d=p.first;
|
||||
int v=p.second;
|
||||
|
||||
if(second_dis[v]<d)
|
||||
{
|
||||
/// 如果这个距离比次短路还长,丢弃
|
||||
continue;
|
||||
}
|
||||
|
||||
int sz=G[v].size();
|
||||
for(int i=0;i<sz;i++)
|
||||
{
|
||||
edge& e=G[v][i];
|
||||
int dd=d+e.dist;
|
||||
|
||||
if(dis[e.to]>dd)
|
||||
{
|
||||
/// 如果最短路比新合成距离长,交换(?)
|
||||
swap(dis[e.to],dd);
|
||||
bus.push(PR(dis[e.to],e.to));
|
||||
}
|
||||
|
||||
/// 现在一定有: dd>dis[e.to]
|
||||
|
||||
if(second_dis[e.to] > dd && dis[e.to] < dd)
|
||||
{
|
||||
second_dis[e.to]=dd;
|
||||
bus.push(PR(second_dis[e.to],e.to));
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
printf("%d\n",second_dis[N-1]);
|
||||
}
|
||||
|
||||
int main()
|
||||
{
|
||||
scanf("%d %d",&N,&R);
|
||||
for(int i=0;i<R;i++)
|
||||
{
|
||||
int A,B,D;
|
||||
scanf("%d %d %d",&A,&B,&D);
|
||||
|
||||
G[A-1].push_back(edge(B-1,D));
|
||||
G[B-1].push_back(edge(A-1,D));
|
||||
}
|
||||
solve();
|
||||
return 0;
|
||||
}
|
Loading…
Reference in New Issue
Block a user