萌新刚学 Bfs ,一直 TLE。
查看原帖
萌新刚学 Bfs ,一直 TLE。
414386
Isshiki·Iroha楼主2021/10/9 18:19

主要问题是下面的 O(n4)O(n^4) 查找,但是题解和我写得差不多呀,怎么就 T 了,求调。

/*
	Name: World Tour
	Copyright: Codeforces 666B
	Author: Isshiki Iroha
	Date: 26/09/21 19:32
	Description: Dijstra or Spfa
*/
#include<bits/stdc++.h>
#define ll long long
using namespace std;
namespace Mashiro {
	char buf[1<<18],*p1=buf,*p2=buf;
	inline int getc() {
		return p1==p2&&(p2=(p1=buf)+fread(buf,1,1<<18,stdin),p1==p2)?EOF:*p1++;
	}
//#define getc() getchar()
	template<typename T>inline void read(T& x) {
		x=0;
		int f=1;
		char ch=getc();
		while(!isdigit(ch)) {
			if(ch=='-')f=~f+1;
			ch=getc();
		}
		while (isdigit (ch)) {
			x=(x<<3)+(x<<1)+(ch^48);
			ch=getc();
		}
		x*=f;
	}
	template <typename T,typename... Args> inline void read(T& x, Args&... args) {
		read(x);
		read(args...);
	}
	char buffer[1<<18];
	int p11=-1;
	const int p22=(1<<18)-1;
	inline void flush() {
		fwrite(buffer,1,p11+1,stdout),p11=-1;
	}
	inline void putc(const char &x) {
		if (p11==p22) flush();
		buffer[++p11]=x;
	}
	template<typename T>inline void write(T x) {
		static int buf[40],top=0;
		if(x<0)putc('-'),x=~x+1;
		while(x)buf[++top]=x%10,x/=10;
		if(top==0)buf[++top]=0;
		while (top) putc(buf[top--]^48);
		putc(' ');
		flush();
	}
	template <typename T,typename... Args> inline void write(T x, Args... args) {
		write(x);
		write(args...);
	}
}
using namespace Mashiro;
const int maxn=3e3+10;
const int maxm=5e5+10;
const int INF=0x3f3f3f3f;
typedef pair<int,int> PII;
int n,m;
int ans1=INF,ans2=INF,ans3=INF,ans4=INF,sigma_ans=-INF;
int head[maxn],tot;
struct node {
	int v,nxt;
} kano[maxm];
inline void add_kano(int u,int v) {
	++tot;
	kano[tot].nxt=head[u];
	kano[tot].v=v;
	head[u]=tot;
}
int dis[maxn][maxn];
int vis[maxn];
queue<int>q;
inline void bfs(int s) {
    for(int i(1);i<=n;++i){
        dis[s][i]=INF;
        vis[i]=0;
    }
    dis[s][s]=0;
	vis[s]=1;
    q.push(s);
    while(!q.empty()){
        int u=q.front();
        q.pop();
        for(int i(head[u]);i;i=kano[i].nxt){
            int v=kano[i].v;
            if(vis[v])continue;
            dis[s][v]=dis[s][u]+1;
            q.push(v);
            vis[v]=1;
        }
    }
}
const int cmp(int a,int b) {
	return a>b;
}

vector<int>arrive[maxn];

int main() {
	read(n,m);
	for(int i(1),u,v; i<=m; ++i) {
		read(u,v);
		add_kano(u,v);
	}
	for(int i(1); i<=n; ++i) {
		bfs(i);
		for(int j(1);j<=n;++j){
			if(i==j||dis[i][j]>=INF)continue;
			arrive[i].push_back(j);
		}
	}
	for(int i(1);i<=n;++i){
		for(auto j:arrive[i]){
			if(i==j)continue;
			for(auto k:arrive[j]){
				if(i==k||j==k)continue;
				for(auto l:arrive[k]){
					if(i==l||j==l||k==l)continue;
					if(dis[i][j]+dis[j][k]+dis[k][l]>sigma_ans){
						sigma_ans=dis[i][j]+dis[j][k]+dis[k][l];
						ans1=i,ans2=j,ans3=k,ans4=l;
					}
				}
			}
		}
	}

	write(ans1,ans2,ans3,ans4);
	return 0;
}

2021/10/9 18:19
加载中...