题目链接: http://poj.org/problem?id=2236
题目大意:给你n台坏的电脑(从1~n编号),以及电脑之间能连接的最远距离d。
然后输入O k1表示修复k1号电脑(当然1<=k1<=n);输入S k1 k2表示k1 k2号电脑能否连接;
当然能连接的充要条件有两个,第一个是两台电脑都是修复好了的;第二点就是两台电脑之间的距离小于d;
解法 : 并查集
判断修复好的电脑之间的距离是否小于d,如果小于d就将根并在一起就行了。
然后我本来一次就过了的,因为最终结果的“FAIL”手残打成了“FALL” 光荣WA了一次,请看官吸取我的教训,别犯这么蠢的错误Orz
代码:
/*Author onisac
测试结果: AC
POJ 2236*/
#include <iostream>
#include <sstream>
#include <ios>
#include <iomanip>
#include <functional>
#include <algorithm>
#include <vector>
#include <string>
#include <list>
#include <queue>
#include <deque>
#include <stack>
#include <set>
#include <map>
#include <cstdio>
#include <cstdlib>
#include <cmath>
#include <cstring>
#include <climits>
#include <cctype>
using namespace std;
#define INF 0x3FFFFFFF;
#define MP(X,Y) make_pair(X,Y)
#define PB(X) push_back(X)
#define MP(X,Y) make_pair(X,Y)
#define PB(X) push_back(X)
#define CLR(A,X) memset(A,X,sizeof(A))
#define Rep(x,n) for(int x=0;x<n;++x)
#define Rep2(x,l,n) for(int x=l;x<n;++x)
typedef long long ll;
typedef pair<int,int> PII;
typedef vector<PII> VII;
typedef vector<int> VI;
const int MAXN = 100010;
int ra[1005],pa[1005];
int flag[1005];
void init(int n)
{
for(int i=0;i<=n;++i)
{
ra[i]=0;
pa[i]=i;
flag[i]=0;
}
}
int find(int x)
{
if(x!=pa[x])pa[x]=find(pa[x]);
return pa[x];
}
void unite(int x,int y)
{
x=find(x);
y=find(y);
if(x==y)return;
if(ra[x]>ra[y])
{
pa[y]=x;
}
else
{
pa[x]=y;
if(ra[x]==ra[y])ra[y]++;
}
return ;
}
bool same(int x,int y)
{
x=find(x);
y=find(y);
if(x==y)return 1;
else return 0;
}
int main()
{
int n,m;
ios::sync_with_stdio(0);
while(cin>>n>>m)
{
init(n);
VII v;
v.PB(MP(0,0));
for(int i=0;i<n;++i)
{
int x,y;
cin>>x>>y;
v.push_back(MP(x,y));
}
// Rep(i,n)cout<<v[i].first<<' '<<v[i].second<<endl;
char s;
int k1,k2;
while(cin>>s)
{
if(s=='O')
{
cin>>k1;
// cout<<k1<<endl;
flag[k1]=1;
// cout<<v[k1].first<<' '<<v[k1].second<<endl;
for(int i=1;i<=n;++i)
{
if(flag[i]==1 && i!=k1)
{
int dis=(v[i].first-v[k1].first)*(v[i].first-v[k1].first);
dis+=(v[i].second-v[k1].second)*(v[i].second-v[k1].second);
// cout<<dis<<endl;
if(dis<=m*m)
{
unite(i,k1);
}
}
}
}
else if(s=='S')
{
cin>>k1>>k2;
if(same(k1,k2))cout<<"SUCCESS"<<endl;
else cout<<"FAIL"<<endl;
}
//cout<<s<<' '<<k<<endl;
}
}
return 0;
}
本文介绍了一道计算机编程题目的解决思路,该题目要求使用并查集算法来判断修复的电脑之间是否能够成功连接,具体通过输入指令修复电脑或询问两台电脑是否能连接来实现。
621

被折叠的 条评论
为什么被折叠?



