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=1,因为后面有i−1,一减就是−1,就直接寄掉了。
- 要memset你的min数组
memset(mn , 0x3f , sizeof(mn));
不然除了−1就是0
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);
- 数据范围是1≤n<104,1≤m<5×104
const int maxn = 5e4 + 10;
struct edge
{
int u , v , w;
............
}e[maxn];
struct node
{
int to,nxt,w;
}mp[2*maxn];
此代码意思就是:
并查集所需的结构体edge只需要一个maxn
而链式前向星所需的结构体node却需要maxn×2,因为是双向边。
还有,注意maxn到底是104还是5×104