60分求调,最后两个点一个TLE,一个MLE,非常规方法
查看原帖
60分求调,最后两个点一个TLE,一个MLE,非常规方法
793342
blue_demon楼主2024/8/11 21:02
#include <bits/stdc++.h>
using namespace std;
int n,m;
vector<vector<int>> mp;
map<pair<int,int>,bool> vis;
int cnt[1000007],num[1000007];
const int inf=0x3f3f3f3f;
struct point{
	int step,now,pl;
};
void bfs(int st){
	queue<point> q;
	
	point p114514;
	
	p114514.now =1;
	p114514.step =0;
	p114514.pl  =1;
	q.push(p114514);
	
	num[1]=0,cnt[1]=1;
	
	while(!q.empty()){
		
		point p=q.front();q.pop();
		
		int x=p.now ;
		
		for(int i=0;i<mp[x].size();i++){
			int y=mp[x][i];
			if(num[y]>p.step +1){
				num[y]=p.step+1;
				cnt[y]=p.pl ;
				cnt[y]%=100003;
				point p1;
				p1.now =y,p1.pl =p.pl,p1.step =num[y];
				q.push(p1);
			}else if(num[y]==p.step+1){
				cnt[y]+=p.pl ;
				cnt[y]%=100003;
				
				point p1;
				p1.now =y,p1.pl =p.pl,p1.step =num[y];
				q.push(p1);
			}
//			cout<<"from: "<<x<<" to: "<<y<<" cnt["<<y<<"]= "<<cnt[y]<<" num["<<y<<"]= "<<num[y]<<endl;
		}
		
	}
}
int main()
{
	cin>>n>>m;
	memset(num,inf,sizeof(num));
	mp.resize(n+1);
	for(int i=1;i<=m;i++){
		int x,y;
		scanf("%d%d",&x,&y);
		if(x==y)continue;
		mp[x].push_back(y);
		mp[y].push_back(x);
	}
	
	bfs(1);
	for(int i=1;i<=n;i++){
		cout<<cnt[i]<<endl;
	}
	return 0;
}

2024/8/11 21:02
加载中...