您当前的位置: 首页 > 

钟钟终

暂无认证

  • 0浏览

    0关注

    233博文

    0收益

  • 0浏览

    0点赞

    0打赏

    0留言

私信
关注
热门博文

P1197 [JSOI2008]星球大战 并查集的逆向思维+链式前向星

钟钟终 发布时间:2022-02-01 00:11:03 ,浏览量:0

P1197 [JSOI2008]星球大战 https://www.luogu.com.cn/problem/P1197 我真的心态崩了,找了三个小时才发现错误在哪里。我的习惯是从1开始记录数据,一直就超时,怎么都超时,但还是能过几组样例,我以为是算法问题,没想到是head[0]没更新成-1,只要u的位置上出现0,第一组的cnt直接存成0。本题星球是从0到n-1编号的。。。。。 啊啊啊啊,好烦,浪费了这么久,好在是发现错哪了,交了整整两页才发现。 真的巨坑,巨坑,好大的陷阱!!!我说题解为什么从0开始记录数据,原来就是去避免链式前向星存在的这个陷阱。 表示没有,可用0或者-1来表示,head是用来表示变得下标 如果初始化为0,那么head[0]是不能保存信息的; 如果初始化成-1,一定要记得head[0]=-1;

#include 
using namespace std;
const int maxn=4e5+5;
struct node
{
    int from,to,nxt;
}e[maxn];
int f[maxn],n,m,ans,p[maxn],q[maxn],cnt,k,total,head[2*maxn];
bool vis[maxn];
inline void add_edge(int u,int v)
{
    e[++cnt].to=v;
    e[cnt].from=u;
    e[cnt].nxt=head[u];
    head[u]=cnt;
}
int r_find(int x)
{
    if(x!=f[x]) 
        f[x]=r_find(f[x]); 
    return f[x];
}

inline void mg(int x,int y)
{
    int fx,fy;
    fx=r_find(x);fy=r_find(y);
    if(fx!=fy)
        f[fx]=fy;
}
int main()
{
    head[0]=-1;
    scanf("%d%d",&n,&m);
    for(register int i=1;i            
关注
打赏
1664378814
查看更多评论
0.0398s