为什么这段代码会TLE?
#include <bits/stdc++.h>
using namespace std;
long long int dp[200009];//起点到目标点的最短路径
int n,m,p;
bool v[100009];
int pre[100009];
struct ff{
int weight,next,adj;
};
int g[100009];
ff a[2000009];
long long int h[2000009][4];//存放终点、当前最短路径 和后继 、前驱
int head=0;
int tail=1;
void push(int x,long long int y){//需要插入的顶点和它的最短路径
int i=h[head][2];
h[tail][0]=x;
h[tail][1]=y;
while(y>h[i][1]){
if(h[i][2]==0)break;
i=h[i][2];
}
if(h[i][1]>=y){
h[tail][2]=i;
h[h[i][3]][2]=tail;
h[tail][3]=h[i][3];
h[i][3]=tail;
}
else{
h[i][2]=tail;
h[tail][3]=i;
}
tail++;
//cout<<2;
}
int top(){
int tt=h[head][2];
h[h[tt][2]][3]=head;
h[head][2]=h[tt][2];
return h[tt][0];
}
int tot;
void add(int x,int y,int w){
if(g[x]){
int q;//顶点在邻接表的位置
for(int i=g[x];;i=a[i].next){
q=i;
if(a[i].next==0)break;
}
tot++;
a[tot].adj=y;
a[q].next=tot;
a[tot].weight=w;
}
else {
tot++;
a[tot].adj=y;
g[x]=tot;
a[tot].weight=w;
}
}
void print(int x){
for(int i=g[x];;i=a[i].next){
cout<<a[i].adj<<" ";
if(!a[i].next){
cout<<endl;
return ;
}
}
}
int main()
{
// freopen("P4779_3.in","r",stdin);
// freopen("4779.out","w",stdout);
cin>>n>>m>>p;
//h[head][1]=-1;
for(int i=1;i<=n;i++)dp[i]=2147483647;
for(int i=1;i<=m;i++){
int x,y,w;
cin>>x>>y>>w;
add(x,y,w);
//add(y,x,w);
}
//cout<<endl;
dp[p]=0;
v[0]=1;
push(p,dp[p]);
//cout<<top()<<endl;
while(h[head][2]!=0){
int t=top();
//cout<<t<<" "<<dp[t]<<" "<<pre[t]<<endl;
v[t]=1;//v[5]=1
//if(h[t][1]!=dp[t])continue;
for(int j=g[t];j>0;j=a[j].next){//j=g[5]=6
//cout<<" "<<a[j].adj<<endl;
//cout<<a[j].adj<<" "<<v[a[j].adj]<<" "<<a[j].weight<<endl;
if(!v[a[j].adj]){
//cout<<dp[a[j].adj]<<"** "<<dp[t]<<" "<<a[t].adj<<" "<<a[j].weight<<endl;
if(dp[a[j].adj]>dp[t]+a[j].weight){//t=5 dp[5]=0 +g[5]=6
dp[a[j].adj]=dp[t]+a[j].weight;//
pre[a[j].adj]=t;
push(a[j].adj,dp[a[j].adj]);
}
}
//cout<<a[j].next<<endl;
//if(a[j].next==0)break;
}
}
//for(int i=1;i<=tot;i++)cout<<i<<" "<<a[i].adj<<" "<<a[i].weight<<endl;
//for(int i=1;i<=n;i++)print(i);
for(int i=1;i<=n;i++)cout<<dp[i]<<" ";
return 0;
}