zoj 2833这次真的很顺利了。。居然是因为数组的大小没有符合要求,瞎折腾了很久。。没有注意到要求范围,真是该死!

想法很简单,就是定义一个父结点数组,下标 i 表示这个元素,初始化为 -1表示 这个元素的朋友只有自己,当parent[i]为负数时,朋友的个数就是|parent[i]| 即绝对值,如果parent[i]为正数,则表示 i的父结点。通过find找到i的根,其中使用了权重合并,即结点少的合并在结点多的树上。注意如果根相同,即已经 是朋友了,就不需要再合并了。 真是好神奇的并查集,将正数负数用得如此淋漓尽致!这次终于算是我独立写出来的了,好高兴!

//
// //#include "stdafx.h"
#include <stdio.h>
#include <iostream>
#include"memory.h"
using namespace std;
#define Maxsize 100000//最多元素个数
int parent[Maxsize];
void WeightedUnion(int i, int j)
{
//基于权重对根合并,将结点少的合并到结点多的
int temp = parent[i] + parent[j];
if (parent[j] < parent[i])//i的结点比较少
{
parent[i] = j;//i 成为j的结点
parent[j] = temp;//j 的结点等于 i+j
}
else//i的结点多于或等于j 的结点
{
parent[j] = i;
parent[i] = temp;
}
}
int findparent(int i)
{
while (parent[i] >= 0)//不为根
{
i = parent[i];
}
return i;
}
int main( )
{ int n, m, x, y, flag = 0, count = 0;
char c; while (scanf_s("%d%d", &n, &m) != EOF)
{
memset(parent, -1, sizeof(parent));//将每个根置为-1 while (m--)
{ cin >> c;//gets(c);//scanf_s("%c",&c);
if (c == 'M')//M交朋友,调整根的数据
{
scanf_s("%d%d", &x, &y);
x = findparent(x);//找到自己所在的根
y = findparent(y);
if (x != y)//不是同一个根,不为friend
{
WeightedUnion(x, y);
}
}
else
if (c == 'Q')//询问,输出friend个数
{
scanf_s("%d", &x);
if (flag == 0)
{
if (count++ != 0)
printf("\n");
printf("Case %d:\n", count);
flag = 1;
} printf("%d\n", -parent[findparent(x)]);//求到根,输出这棵树有多少结点 } }
flag = 0;
}
return 0;
}

by the way ,因为vs编译的,如果要AC要将#include "stdafx.h"去掉和将
scanf_s改成scanf

这次还发现了以前犯得一个蠢爆了的问题,真是气死我了!

zoj 2833 friendship的更多相关文章

  1. ZOJ:2833 Friendship(并查集+哈希)

    http://acm.zju.edu.cn/onlinejudge/showProblem.do?problemCode=2833 A friend is like a flower, a rose ...

  2. 【转载】图论 500题——主要为hdu/poj/zoj

    转自——http://blog.csdn.net/qwe20060514/article/details/8112550 =============================以下是最小生成树+并 ...

  3. ZOJ People Counting

    第十三届浙江省大学生程序设计竞赛 I 题, 一道模拟题. ZOJ  3944http://www.icpc.moe/onlinejudge/showProblem.do?problemCode=394 ...

  4. POJ 1815 Friendship

    Friendship Time Limit: 2000MS   Memory Limit: 20000K Total Submissions: 10626   Accepted: 2949 Descr ...

  5. ZOJ 3686 A Simple Tree Problem

    A Simple Tree Problem Time Limit: 3 Seconds      Memory Limit: 65536 KB Given a rooted tree, each no ...

  6. ZOJ Problem Set - 1394 Polar Explorer

    这道题目还是简单的,但是自己WA了好几次,总结下: 1.对输入的总结,加上上次ZOJ Problem Set - 1334 Basically Speaking ac代码及总结这道题目的总结 题目要求 ...

  7. ZOJ Problem Set - 1392 The Hardest Problem Ever

    放了一个长长的暑假,可能是这辈子最后一个这么长的暑假了吧,呵呵...今天来实验室了,先找了zoj上面简单的题目练练手直接贴代码了,不解释,就是一道简单的密文转换问题: #include <std ...

  8. ZOJ Problem Set - 1049 I Think I Need a Houseboat

    这道题目说白了是一道平面几何的数学问题,重在理解题目的意思: 题目说,弗雷德想买地盖房养老,但是土地每年会被密西西比河淹掉一部分,而且经调查是以半圆形的方式淹没的,每年淹没50平方英里,以初始水岸线为 ...

  9. ZOJ Problem Set - 1006 Do the Untwist

    今天在ZOJ上做了道很简单的题目是关于加密解密问题的,此题的关键点就在于求余的逆运算: 比如假设都是正整数 A=(B-C)%D 则 B - C = D*n + A 其中 A < D 移项 B = ...

随机推荐

  1. jquery怎么跳出当前的each循环

    有些朋友可能会以为在jquery跳出循环可以直接使用continue和break了,但是使用之后没有效果,因为在jquery中没有这两条命令. 后来上网查了下,得到了结果: return false; ...

  2. HTML 中按钮作为form表单元素提交特性两则 --- 参HTML考标准分析

    相同name的submit 类型的input提交行为 描述 这种情况, <input type="submit" name="ACTION" value= ...

  3. copy file to docker from realhost

    http://blog.e3rp4y.me/blog/2014/05/23/copy-file-from-host-to-docker.html --------------------------- ...

  4. JDBC增删改查,PreparedStatement和Statement的区别

    此篇是在上一篇的基础上使用PreparedStatement对象来实现JDBC增删改查的 具体工具类JDBCTools和实现类和配置文件在上一篇Statement对象实现的时候有写. 上一篇地址htt ...

  5. 用OOP设计以下场景。太阳发出太阳光,照射在墙壁上,在地面形成影子。

    首先分析出有哪些实体类,太阳.太阳光.墙壁.地面.影子 然后分析太阳应该继承自发光体类.太阳光继承自光类.墙壁继承自物体类 地面是一个承载影子的容器.

  6. for循环使用详解(c语言版)

    说明:c语言的很多语法部分都和JAVA,AS等相同 特别是for的用法. c语言中的for循环语句使用最为灵活,不仅可以用于循环次数已经确定的情况,而且可以用于循环次数不确定而只给出循环结束条件的情况 ...

  7. TBB 学习笔记

    #include <tbb/task_scheduler_init.h> #include <tbb/blocked_range.h> #include <tbb/par ...

  8. 【SSO单点系列】(3):CAS4.0 登录页验证码的添加

    2016.08.23 更新 注意:这个教程只适合4.0版本的,4.1以及以上的版本的已经不试用了, 后面几篇有人提到过 源码网盘链接更新了下 : 链接: http://pan.baidu.com/s/ ...

  9. Android中插件开发篇之----应用换肤原理解析

    一.前言 今天又到周末了,感觉时间过的很快呀.又要写blog了.那么今天就来看看应用的换肤原理解析.在之前的一篇博客中我说道了Android中的插件开发篇的基础:类加载器的相关知识.没看过的同学可以转 ...

  10. c++11中的for简化用法

    1.序列for循环 map<string,int> m{{"a",1},{"b",2},{"c",3}} for(auto p: ...