TLE90分求助
查看原帖
TLE90分求助
210719
Violet___Evergarden楼主2021/8/19 16:24

用的是 dij

#include <iostream>
#include <algorithm>
#include <queue>
using namespace std;
const int kMaxN=5001;
const int kMaxM=100000;
int n,r,cnt;
struct EDGE
{
  int to,nt,qu;
}e[kMaxM*2];
int hd[kMaxN],ans1[kMaxN],ans2[kMaxN];
bool vis[kMaxN];
struct DIAN
{
  int where,dis;
  bool operator <(const DIAN &x)const
  {
    return x.dis>dis;
  }
};
priority_queue<DIAN>q;
void Add(int a,int b,int c)
{
  e[++cnt].to=b;
  e[cnt].nt=hd[a];
  e[cnt].qu=c;
  hd[a]=cnt;
}
void Dij()
{
  ans1[1]=0;
  q.push((DIAN){1,0});
  while(!q.empty())
  {
    int now=q.top().where,dis=q.top().dis;//取出队头
    q.pop();
    for(int i=hd[now];i;i=e[i].nt)
    {
      if(ans1[e[i].to]>dis+e[i].qu)//如果当前这条路更短
      {
        ans2[e[i].to]=ans1[e[i].to];//以前的最短就成了次短
        ans1[e[i].to]=dis+e[i].qu;//更新现在的最短
        q.push((DIAN){e[i].to,ans1[e[i].to]});//两种情况都入队
        q.push((DIAN){e[i].to,ans2[e[i].to]});
      }
      else if(ans2[e[i].to]>dis+e[i].qu)//不能更新最短但能更新次短
      {
        ans2[e[i].to]=dis+e[i].qu;//更新次短
        q.push((DIAN){e[i].to,ans2[e[i].to]});
      }
    }
  }
}
int main()
{
cin>>n>>r;
for(int i=1;i<=r;i++)
{
  int a,b,c;
  cin>>a>>b>>c;
  Add(a,b,c);
  Add(b,a,c);
}
for(int i=1;i<=n;i++)
{
  ans1[i]=1e9;
  ans2[i]=1e9;
}
Dij();
cout<<ans2[n];
return 0;
}
2021/8/19 16:24
加载中...