样例二没过但是AC了
查看原帖
样例二没过但是AC了
715293
yanjiadong楼主2023/9/17 15:32

数据显然出水了

评测记录:https://www.luogu.com.cn/record/124993462

#include<bits/stdc++.h>
using namespace std;
#define lowbit(x) (x&-x)
#define fir first
#define sec second
#define ls u<<1
#define rs u<<1|1
#define mid l+r>>1
namespace fastio {
#if defined(fre)
	void fropen(string s){freopen((s+".in").c_str(),"r",stdin);freopen((s+".out").c_str(),"w",stdout);};void frclose(){fclose(stdin);fclose(stdout);}
#endif
	template<typename T>inline void _read(T &x) {char t=getchar();bool tmp=0;x=0;while(t<'0'||t>'9'){if(t=='-')tmp=1;t=getchar();};while('0'<=t&&t<='9'){x=(x<<1)+(x<<3)+(t^48);t=getchar();}if(tmp)x=-x;}
	void read(){}template<typename T,typename ...T2>inline void read(T &x,T2 &...oth) {_read(x);read(oth...);}
	template<typename T>inline void read(T *l,T *r) {T *cur=l;while(cur!=r){_read(*cur);++cur;}}
	template<typename T,typename T2>inline void read(T *l,T *r,T2 *l2,T2 *r2) {T *cur=l;T2 *cur2=l2;while(cur!=r){_read(*cur),_read(*cur2);++cur,++cur2;}}
	template<typename T,typename T2,typename T3>inline void read(T *l,T *r,T2 *l2,T2 *r2,T3 *l3,T3 *r3) {T *cur=l;T2 *cur2=l2;T3 *cur3=l3;while(cur!=r){_read(*cur),_read(*cur2),_read(*cur3);++cur,++cur2,++cur3;}}
	template<typename T>inline void _write(T x) {if(x<0){putchar('-');x=-x;}if(x/10)_write(x/10);putchar((x%10)^48);}
	void write(){putchar('\n');}template<typename T,typename ...T2>inline void write(T x,T2 ...oth) {_write(x);write(oth...);}
	template<typename T>inline void write(T *l,T *r) {T *cur=l;while(cur!=r){_write(*cur);putchar(' ');++cur;}putchar('\n');}}
using namespace fastio;
struct node {
	int x;
	int step;
	int y;
};
//queue<node>que;
node a[50000007];
int cur=0,cnt=0;
//int head,tair;
vector<int>vec[5000006];
const int INF=201000318;
int vis[5000006];
int spfa[5000006];
int dijkstra[5000006];
int num=0;
int main() {
	int n,m,s,t;
	read(n,m);
	while(m--) {
		int x,y;read(x,y);
		vec[x].push_back(y);
		vec[y].push_back(x);
	}
	read(s,t);
	cur=cnt=0;
	a[cnt++]={t,0,0};
//	que.push({t,0,0});
	for(int i=0;i<=n;i++) {
		spfa[i]=INF;
		dijkstra[i]=INF;
	}
	while(cur!=cnt) {
		node tmp=a[cur++];
		int x=tmp.x;
		int step=tmp.step;
//		que.pop();
		if(x==s)continue;
		if(spfa[x]^INF)continue;
		spfa[x]=step;
		for(auto i:vec[x]) {
			if(spfa[i]==INF)
			a[cnt++]={i,step+1,0};
//			que.push({i,step+1,0});
		}
	}
	cur=cnt=0;
	a[cnt++]={s,0,0};
//	que.push({s,0,0});
	while(cur!=cnt) {
		node tmp=a[cur++];
		int x=tmp.x;
		int step=tmp.step;
//		que.pop();
		if(spfa[x]<=step)continue;
		if(dijkstra[x]^INF)continue;
		dijkstra[x]=step;
		for(auto i:vec[x]) {
			if(dijkstra[i]==INF&&spfa[i]>step)
			a[cnt++]={i,step+1,0};
//			que.push({i,step+1,0});
		}
	}
	cur=cnt=0;
	a[cnt++]={s,0,INF};
//	que.push({s,0,INF});
	while(cur!=cnt) {
		node tmp=a[cur++];
		int x=tmp.x;
		int step=tmp.step;
		int y=tmp.y;
//		que.pop();
		if(vis[x])continue;
		if(step*2>=y)continue;
		y=min(y,spfa[x]+dijkstra[x]);
		vis[x]=1;
		num++;
		for(auto i:vec[x]) {
			if(!vis[i])
			a[cnt++]={i,step+1,y};
//			que.push({i,step+1,y});
		}
	}
	write(num-1);
	return 0;
}
2023/9/17 15:32
加载中...