poj2236

来源:互联网 发布:mysql的端口号 编辑:程序博客网 时间:2024/05/16 10:13

链接:点击打开链接

题意:有N台坏的电脑,两台电脑之间距离必须小于等于d才能通信,如果A和B能通信,B和C能通信则,A和C也能通信,以此类推,给出N台电脑的坐标,然后给出一些操作,有两种形式分别是"O p":代表修好了第p台电脑,"S p q":代表询问第p台电脑和第q台电脑是否可以通信,如果可以输出"SUCCESS",否则输出"FAIL"

代码:

#include <queue>#include <cstdio>#include <cstring>#include <stdlib.h>#include <iostream>#include <algorithm>using namespace std;int N,d;int par[1005],rank[2005];void init(int n){    int i;    for(i=0;i<=n;i++){    par[i]=i;    rank[i]=0;    }}int find(int x){    if(par[x]==x)    return x;    return par[x]=find(par[x]);}void unite(int x,int y){    x=find(x);    y=find(y);    if(x==y)return;    if(rank[x]<rank[y])    par[x]=y;    else{        par[y]=x;        if(rank[x]==rank[y])        rank[x]++;    }}bool same(int x,int y){    return find(x)==find(y);}                                       //并查集模板struct node{    int x,y,id;};int cal(node a,node b){    return (a.x-b.x)*(a.x-b.x)+(a.y-b.y)*(a.y-b.y);}vector<node> v;node s[1005];int main(){    int i,j,st,en,num;    char c;    scanf("%d%d",&N,&d);    init(N);    for(i=1;i<=N;i++){    scanf("%d%d",&s[i].x,&s[i].y);    s[i].id=i;    }    while(scanf(" %c",&c)!=EOF){        //用空格%c吃回车    if(c=='O'){        scanf("%d",&num);        for(i=0;i<v.size();i++)        if(cal(s[v[i].id],s[num])<=d*d)        unite(v[i].id,num);             //距离小于d的连上        v.push_back(s[num]);            //用vector记录修好的电脑    }    else{        scanf("%d%d",&st,&en);        if(same(st,en))        puts("SUCCESS");        else        puts("FAIL");    }    }    return 0;}

0 0
原创粉丝点击