POJ2236详细的解题报告(C语言版)
2014-02-25 13:26
459 查看
#include<stdio.h> #include<string.h> int a[100000]; int flag[100000];//标记电脑是否被修,1为修好,0为未修 int b[100000][2];//坐标 int n; void creat() { for(int i=1;i<=n;i++)//由于题目要求N>0,编号大于0 { a[i]=i; } } int set_friend(int x)//找祖先 { int r=x; while(a[r]!=r) { r=a[r]; } int i=x; int j; while(i!=r)//路径压缩 { j=a[i]; a[i]=r; i=j; } return r; } void join_friend(int x,int y)//连起来 { int fx=set_friend(x); int fy=set_friend(y); if(fx!=fy) { a[fx]=fy; } } int is_friend(int x,int y)//判断电脑是否可以连通 { int fx=set_friend(x); int fy=set_friend(y); if(fx==fy) return 1; else return 0; } int distance(int x,int y)//求两台电脑之间距离的平方 { return ((b[x][0]-b[y][0])* (b[x][0]-b[y][0])+(b[x][1]-b[y][1])*(b[x][1]-b[y][1])); } int main() { int d; char c[10]; while( scanf("%d%d",&n,&d)!=EOF) { creat(); memset(flag,0,sizeof(flag)); for(int i=1;i<=n;i++) { scanf("%d%d",&b[i][0],&b[i][1]); } d*=d;//距离的平方进行判断,方便 while(scanf("%s",c)!=EOF) { if(c[0]=='O') { int t; scanf("%d",&t); flag[t]=1; for(int j=1;j<=n;j++) { if(flag[j]==1&&distance(j,t)<=d) { join_friend(j,t); } } } if(c[0]=='S') { int a,b; scanf("%d%d",&a,&b); if( is_friend(a,b)==1) printf("SUCCESS\n"); else if(is_friend(a,b)==0) printf("FAL\n"); } } } return 0; }
相关文章推荐
- C++中"std::"是什么意思?起什么作用?namespace?iostream和iostream.h的区别
- 如何c++去除string字符串首尾的\n,\r,\t,空格?
- 能让你成为更优秀程序员的10个C语言资源
- Visual C++ 编译器参数传递和命名约定——关于__cdecl和__stdcall
- 华为机试通过键盘输入100以内正整数的加、减运算式,请编写一个程序输出运算结果字符串
- c语言-扑克牌小魔术
- c语言-猜数字游戏
- python 像C语言样的函数参数引用实现..
- C语言学习——结构体
- C++中友元(友元函数和友元类)的用法和功能
- EasyX Library for C++ (Ver:2013冬至版)头文件整理
- kmp算法详解
- 《c++stl中文版》读书心得
- 职责链模式(C++实现)
- C#与C++之间类型的对应
- C语言--局部/全局字符串存放在哪个段
- hdoj1002--A + B Problem II
- C/C++语言, 趣味问题
- VC++界面编程之--实现一个画板并提供文字输入功能(MsPaint)
- 当打开一个.h或.cpp文件时, Solution Explorer就自动展开文件所在的目录