• 无限种类并查集+离散化——pku1733(中上难度)


    学习了种类并查集,又学了离散化STL里的map容器
    这几题里比较侧重对find()函数的理解
    View Code
    #include<iostream>
    #include
    <map>
    using namespace std;

    #define N 10005

    int f[N];
    int r[N];
    map
    <int,int>mm;
    int find(int pos)
    {
    if(f[pos]==-1)
    return pos;
    int t=f[pos];
    f[pos]
    =find(f[pos]);//使f[pos]路径压缩,指向最终根节点
    r[pos]=(r[pos]+r[t])%2;//r[pos]由自己与自己下一个点决定

    return f[pos];
    }

    int un(int a,int b,int d)
    {
    int fa=find(a);
    int fb=find(b);

    if(fa==fb)
    {
    if((r[a]+r[b])%2==d)return 1;
    else
    return 0;
    }
    else
    {
    f[fa]
    =fb;
    r[fa]
    =(r[a]+r[b]+d)%2;
    return 1;
    }
    }
    int main()
    {
    int n,m,i;
    for(i=0;i<=10000;i++)
    {
    f[i]
    =-1;
    r[i]
    =0;
    }
    scanf(
    "%d%d",&n,&m);

    char str[10];
    int a,b,add=0,x,y;
    for(i=1;i<=m;i++)
    {
    scanf(
    "%d%d%s",&a,&b,&str);

    a
    --;
    if(mm.find(a)==mm.end())
    {
    mm[a]
    =add++;
    }
    x
    =mm[a];
    if(mm.find(b)==mm.end())
    {
    mm[b]
    =add++;
    }
    y
    =mm[b];

    int d;
    if(strcmp(str,"odd")==0)
    d
    =1;
    else
    d
    =0;

    if(un(x,y,d)==0)
    {
    break;
    }
    }
    printf(
    "%d\n",i-1);
    return 0;
    }
  • 相关阅读:
    文章目录
    平滑的加权轮询
    ESG
    JDK
    集合
    数组
    多线程(下)
    多线程
    Java常用类
    jdk5.0新增线程创建方式
  • 原文地址:https://www.cnblogs.com/huhuuu/p/1967486.html
Copyright © 2020-2023  润新知