在其他oj上ac了,但是在洛谷第八个点TLE了,看到题解上有对每个点dfs100次都行,为什么以下下代码会TLE,求神仙指导如何改进
#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;
}