良心超长警示后人
查看原帖
良心超长警示后人
719978
DYYqwq楼主2023/1/17 22:22
  • dfsdfs中,
for(int i = 1 ; i <= 25 ; i ++)  // 注意 
{
	fa[u][i] = fa[fa[u][i - 1]][i - 1];
	mn[u][i] = min(mn[u][i - 1] , mn[fa[u][i - 1]][i - 1]);
}

要注意i=1i = 1,因为后面有i1i - 1,一减就是1-1,就直接寄掉了。

  • memsetmemset你的minmin数组
memset(mn , 0x3f , sizeof(mn)); // 注意 

不然除了1-1就是00

  • 要判断输出1-1的情况
scanf("%d%d" , &u , &v);
int ans = solve(u , v);
int uu = get_fa(u);
int vv = get_fa(v);
if(uu != vv || ans == INT_MAX)
	printf("-1\n"); // 注意 
else
	printf("%d\n" , ans);
  • 数据范围是1n<104,1m<5×104 1 \le n < 10^4 , 1 \le m < 5\times 10^4
const int maxn = 5e4 + 10;
struct edge
{
	int u , v , w;
	............
}e[maxn];
struct node
{
	int to,nxt,w;
}mp[2*maxn];

此代码意思就是:

并查集所需的结构体edgeedge只需要一个maxnmaxn

而链式前向星所需的结构体nodenode却需要maxn×2maxn \times 2,因为是双向边。

还有,注意maxnmaxn到底是10410^4还是5×1045 \times 10^4

2023/1/17 22:22
加载中...