题意:求次短路
只需要按照求最短路不断更新dist数组的思想,开多一个dist2数组记录次短路即可
#include <cstdio>
#include <cmath>
#include <cstring>
#include <string>
#include <algorithm>
#include <iostream>
#include <queue>
#include <map>
#include <set>
#include <vector>
using namespace std;
#define INF 0x7f7f7f7f
const __int64 maxn = 100005;
struct node
{
int x;int v;
node(){}
node (int i,int j)
{
x=i;v=j;
}
bool operator < (const node &b) const
{
return v>b.v;
}
};
vector <node> tm[maxn];
int dist[5005];
int dist2[5005];
priority_queue<node> que;
int main()
{
int n,r,i;
int a,b,c;
scanf("%d%d",&n,&r);
memset(dist2,INF,sizeof(dist2));
memset(dist,INF,sizeof(dist));
for (i=1;i<=r;i++)
{
scanf("%d %d %d",&a,&b,&c);
tm[a].push_back(node(b,c));
tm[b].push_back(node(a,c));
}
dist[1]=0;
que.push(node(1,0)); //一定只能把第一个节点放进去,而不能把与1相连的点全部放进队列,这会影响dist2的结果
/* for (i=0;i<tm[1].size();i++)
{
node p=tm[1][i];
dist[p.x]= p.v;
que.push(node(p.x,p.v));
}
*/
int minway;
int minpoint;
while(!que.empty())
{
node p=que.top();
que.pop();
minpoint=p.x;
minway=p.v;
if(dist2[p.x]<minway) //如果比minway都比dis2小,就不用做了(太小).
continue;
for (i=0;i<tm[minpoint].size();i++)
{
int x=tm[minpoint][i].x;
int d2=tm[minpoint][i].v+minway;
if (d2<dist[x]) //如果小于dist
{
dist2[x]=dist[x]; //就把dist给dist2 (前者必然大于当于后者)
dist[x]=d2;
que.push(node(x,dist[x]));
}
else
if (d2<dist2[x]&&d2>dist[x]) //否则如果只小于dist2,则只更新dist2
{
dist2[x]=d2;
que.push(node(x,dist2[x]));
}
}
}
printf("%d\n",dist2[n]);
return 0;
}