求调32pts,TLE
查看原帖
求调32pts,TLE
1029588
Lao_Wang_Ba楼主2025/1/22 11:24

为什么这段代码会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;
}
2025/1/22 11:24
加载中...