在无情的bug与debug中我终于过了!!
不能用邻接矩阵来做,否则会MLE的,我之前就是没用优化,结果内存爆到死;没办法只有硬着头皮学优先队列,多么痛的领悟!
这题要求次短路只需从起点dij一次,从终点dij一次,之后两次+w,与最短比较。就ok了
#include<cstdio>
#include<iostream>
#include<queue>
#include<functional>
#include<vector>
using namespace std;
const int N=5010,inf=0x7fffffff;
typedef pair<int ,int > PAIR;
vector<PAIR>g[N];
int ds[N],dt[N],n,r;
void dijkstra(int S,int dis[])
{
priority_queue<PAIR,vector<PAIR>,greater<PAIR> > que;
for(int i=0;i<=n;i++)dis[i]=inf;
que.push(PAIR(0,S));
dis[S]=0;
while(!que.empty()){
int len=que.top().first,u=que.top().second;
que.pop();
if(len>dis[u])continue;
for(int i=0;i<g[u].size();i++){
int v=g[u][i].first,w=g[u][i].second;
if(len+w<dis[v]){
dis[v]=len+w;
que.push(PAIR(dis[v],v));
}
}
}
}
int main()
{
while(~scanf("%d%d",&n,&r)){
for(int i=0;i<r;i++){
int u,v,d;
scanf("%d%d%d",&u,&v,&d);
g[u].push_back(PAIR(v,d));
g[v].push_back(PAIR(u,d));
}
dijkstra(1,ds);
int sd=ds[n];
dijkstra(n,dt);
int ans=inf;
for(int u=1;u<=n;u++){
for(size_t i=0;i<g[u].size();i++){
int v=g[u][i].first,w=g[u][i].second;
if(ds[u]+w+dt[v]>sd&&ds[u]+w+dt[v]<ans)
ans=ds[u]+w+dt[v];
}
}
printf("%d\n",ans);
for( int i= 0; i<= n; ++i ) g[i].clear();
}
return 0;
}