求助 P8287 「DAOI R1」Flame
  • 板块学术版
  • 楼主The_43_Bachelor
  • 当前回复0
  • 已保存回复0
  • 发布时间2024/4/30 20:32
  • 上次更新2024/4/30 22:55:28
查看原帖
求助 P8287 「DAOI R1」Flame
468872
The_43_Bachelor楼主2024/4/30 20:32

大佬救我!!!!!!

得了30分,TLE 了9个点

What can I say ? Man!

#include<bits/stdc++.h>
using namespace std;
const int N=10000010;
long long cnt,head[N],n,m,p,dis[N],f[N],v[N],t;
bool vis[N];
queue<int> q;
struct node {
	int from,to,nxt;
} e[N];
inline int read()
{
	int x=0,f=1;
	char ch=getchar();
	while (ch<'0'||ch>'9'){if (ch=='-') f=-1;ch=getchar();}
	while (ch>='0'&&ch<='9'){x=x*10+ch-48;ch=getchar();}
	return x*f;
}
inline void add(int u,int v) {
	cnt++;
	e[cnt].from=u;
	e[cnt].nxt=head[u];
	head[u]=cnt;
	e[cnt].to=v;
}
inline void bfs() {
	while(!q.empty()) {
		int now=q.front();
		q.pop();
		if(v[now]==1) {
			continue;
		}
		v[now]=1;
		t=0;
		for(int i=head[now]; ~i; i=e[i].nxt) {
			int y=e[i].to;
			if(v[y]==0) {
				if(dis[y]>dis[now]+1) {
					dis[y]=dis[now]+1;
					q.push(y);
				}
			}
			if(dis[y]>dis[now]+1) {
				dis[y]=dis[now]+1;
			}
			t++;
			if(t>n) {
				break;
			}
		}
	}
}
inline int find(int x) {
	if(x!=f[x]) {
		f[x]=find(f[x]);
	}
	return f[x];
}
inline void zbb(int x,int y) {
	int fx=find(x);
	int fy=find(y);
	if(fx!=fy) {
		f[fx]=fy;
	}
}
inline bool check(int x) {
	for(int i=1; i<=n; i++) {
		f[i]=i;
		vis[i]=0;
	}
	for(int i=1; i<=n; i++) {
		if(dis[i]<=x) {
			vis[i]=1;
		}
	}
	for(int i=1; i<=n; i++) {
		if(vis[i]==1) {
			for(int j=head[i]; j; j=e[j].nxt) {
				if(i<e[j].to&&vis[e[j].to]==1) {
					int fx=find(i);
					int fy=find(e[j].to);
					if(fx!=fy) {
						f[fx]=fy;
					} else {
						return 1;
					}
				}
			}
		}
	}
	return 0;
}
int main() {
	cin>>n>>m>>p;
	for(int i=1; i<=m; i++) {
		int u,v;
		scanf("%lld%lld",&u,&v);
		add(u,v);
		add(v,u);
	}
	if(m<n) {
		cout<<"Poor D!"<<endl;
		return 0;
	}
	for(int i=1; i<=n; i++) {
		dis[i]=210000000;
		f[i]=i;
		vis[i]=0;
	}
	for(int i=1; i<=p; i++) {
		int x;
		scanf("%lld",&x);
		q.push(x);
		dis[x]=0;
	}
	bfs();
	long long l=-1,r=n+1,u,v,fu,fv,ans=21000000000000;
	while(l+1<r) {
		int mid=(l+r)>>1;
		if(check(mid)==1) {
			r=mid;
		} else l=mid;
	}
	cout<<r<<endl;
	return 0;
}
2024/4/30 20:32
加载中...