疑问:邻接表BFS结果最后两个TLE
查看原帖
疑问:邻接表BFS结果最后两个TLE
392679
petrioch楼主2022/4/1 17:25

请问是因为重边吗?邻接矩阵好像就可以过欸

#include<iostream>
#include<cstring>
#include<queue>
using namespace std;
const int maxn=100010,MOD=100003;
#define INF 0x7fffffff

int to[2*maxn], ne[2*maxn],cnt[maxn],dis[maxn],h[maxn],weight[2*maxn],idx;
bool done[maxn];
void add(int u, int v) {
	to[idx] = v, ne[idx] = h[u], h[u] = idx++;//前插链表
}
int n,m;
void bfs(int root) {
    dis[root]=0;
    cnt[root]=1;
	queue<int> q;
	q.push(root);
	done[root]=true;
	while (!q.empty()) {
		int t = q.front(); q.pop();
		for (int i = h[t]; i != -1; i = ne[i]) {
			int y=to[i];
			if(!done[y]) {
    			dis[y]=dis[t]+1;
    			done[y]=true;
    			q.push(y);
			}
			if(dis[y]==dis[t]+1) cnt[y]=(cnt[y]%MOD+cnt[t]%MOD)%MOD;
		}
	}
}
int main() {
	scanf("%d%d", &n, &m);
	memset(h,-1,sizeof h);
	for (int i = 1,x,y; i <= m; i++) {
		scanf("%d%d", &x ,& y);
		add(x, y);
		add(y, x);
	}
    for(int i=1;i<=n;i++) dis[i]=INF,done[i]=false;
    bfs(1);
	for (int i = 1; i <= n; i++) {
		if (dis[i] != INF)
			printf("%d\n", cnt[i] % MOD);
		else puts("0");
	}
	return 0;
}
2022/4/1 17:25
加载中...