這個題玄學衝過,規定每個點訪問次數不能超過50次,然後找優先隊列中第二次到達終點t的狀態返回就ok
記錄一下,怕忘了
#include <cstdio>
#include <cstring>
#include <algorithm>
#include <iostream>
#include <vector>
#include <queue>
#include <set>
using namespace std;
const int maxn=5010;
const int INF=0x3f3f3f3f;
struct HeapNode{
int d,u;
HeapNode(int _d,int _u):d(_d),u(_u){}
bool operator <(const HeapNode &rhs)const{
return d>rhs.d;
}
};
struct Edge{
int from,to;
int w;
Edge(int u,int v,int _w):from(u),to(v),w(_w){}
};
struct Dijkstra{
vector<Edge>edges;
vector<int>G[maxn];
int vis[maxn];
void add_edges(int u,int v,int cost){
edges.push_back(Edge(u,v,cost));
edges.push_back(Edge(v,u,cost));
int m=edges.size();
G[u].push_back(m-2);
G[v].push_back(m-1);
}
int dij(int s,int t){
memset(vis,0,sizeof(vis));
int flag=0;
priority_queue<HeapNode>Q;
Q.push(HeapNode(0,s));
vis[s]++;
while(Q.size()){
HeapNode x=Q.top();Q.pop();
int u=x.u;
if(u==t&&flag){
return x.d;
}
if(u==t&&flag==0){
flag=1;
}
for(int i=0;i<G[u].size();i++){
Edge &e=edges[G[u][i]];
if(vis[e.to]>50){
continue;
}
Q.push(HeapNode(x.d+e.w,e.to));
vis[e.to]++;
}
}
return -1;
}
};
Dijkstra dijkstra;
int main(){
int n,m;
scanf("%d%d",&n,&m);
for(int i=1;i<=m;i++){
int u,v,w;
scanf("%d%d%d",&u,&v,&w);
dijkstra.add_edges(u,v,w);
}
printf("%d\n",dijkstra.dij(1,n));
return 0;
}