TLE1个点,90分求助
查看原帖
TLE1个点,90分求助
247220
StarryWander楼主2021/7/15 21:09

在其他oj上ac了,但是在洛谷第八个点TLE了,看到题解上有对每个点dfs100次都行,为什么以下下代码会TLE,求神仙指导如何改进/kel

#include<bits/stdc++.h>
#define ll long long
using namespace std;
inline int read(){
   int s=0,w=1;
   char ch=getchar();
   while(ch<'0'||ch>'9'){if(ch=='-')w=-1;ch=getchar();}
   while(ch>='0'&&ch<='9') s=s*10+ch-'0',ch=getchar();
   return s*w;
}
struct node{
	int to,nxt;
};
node e[100005];
int head[100005],ans[100005],cnt;
bool vis[100005];
void add(int u,int v){
	e[++cnt].to=v;
	e[cnt].nxt=head[u];
	head[u]=cnt;
}
void dfs(int x){
	vis[x]=1;
	for(int i=head[x];i;i=e[i].nxt){
		if(!vis[e[i].to]){
			//cout<<"ceshi"<<endl;
			dfs(e[i].to);
			//cout<<ans[x]<<" "<<ans[e[i].to]<<endl;
			ans[x]=max(ans[x],ans[e[i].to]);
		}
	}
}
int main(){
	int n=read(),m=read();
	for(int i=1;i<=n;i++) ans[i]=i;
	for(int i=1;i<=m;i++){
		int x=read(),y=read();
		add(x,y);
	}
	for(int i=1;i<=n;i++){
		memset(vis,0,sizeof(vis));
		dfs(i); 
		printf("%d ",ans[i]);
	}
	return 0;
}

还有一个问题:dij模板改成注释掉的几行代码会TLE?

#include<bits/stdc++.h>
#define ll long long
using namespace std;
struct node{
	ll to,nxt,w;
};
const ll INF=1e14;
node e[200005];
ll head[100005],a[100005],d[100005],n,m,cnt;
void add(int u,int v,int w){
	e[++cnt].w=w;
	e[cnt].to=v;
	e[cnt].nxt=head[u];
	head[u]=cnt;
}
void dij(int s){
	priority_queue< pair<ll,ll> , vector< pair<ll,ll> > , greater< pair<ll,ll> > >q;
	for(int i=1;i<=n;i++) d[i]=INF;
	d[s]=0;
	q.push(make_pair(0,s));
	//q.push(make_pair(s,0));
	while(!q.empty()){
		ll u=q.top().second;
		ll v=q.top().first;
		//ll u=q.top().first;
		//ll v=q.top().second;
		q.pop();
		if(d[u]!=v) continue;
		for(int i=head[u];i;i=e[i].nxt){
			ll k=e[i].to;
			ll w=e[i].w;
			if(d[u]+w<d[k]){
				d[k]=d[u]+w;
				q.push(make_pair(d[k],k));
				//q.push(make_pair(k,d[k]));
			}
		}
	}
}
int main(){
	scanf("%lld %lld",&n,&m);
	for(int i=1;i<=m;i++){
		ll x,y,z;
		scanf("%lld %lld %lld",&x,&y,&z);
		add(x,y,z);
	}
	dij(1);
	for(int i=1;i<=n;i++){
		if(d[i]!=INF) printf("%lld ",d[i]);
		else printf("inf ");
	}
	return 0;
}

2021/7/15 21:09
加载中...