CodeVS 2639 约会计划

Portal:http://codevs.cn/problem/2639/

简单题,并查集再加个map,一开始我以为要用图论,失算

FML,我的代码怎么这么长。。。优化太多反而慢啊。。。大常数大师啊。。。

 1 #include<iostream>
 2 #include<algorithm>
 3 #include<set>
 4 #include<cstdio>
 5 #include<cstdlib>
 6 #include<cmath>
 7 #include<map>
 8 #include<cstring>
 9 using namespace std;
10 #define FOR(i,j,k) for(int i=j;i<=k;i++)
11 #define FORD(i,j,k) for(int i=j;i>=k;i--)
12 #define LL long long
13 #define maxn 2010
14 int father[maxn],rank[maxn];
15 int n,m,p;
16 string x,y;
17 map<string,int> name;
18 int setfind(int xx)
19 {
20     int fa=father[xx];
21     if(fa==xx) return fa;
22     else return father[xx]=setfind(fa);
23 }
24 void setunion(int xx,int yy)
25 {
26     int X=setfind(xx);
27     int Y=setfind(yy);
28     if(X==Y) return;
29     if(rank[X]==rank[Y]) {father[X]=Y;rank[Y]++;}
30     else if(rank[X]>rank[Y]) father[X]=Y;
31     else father[Y]=X;
32 }
33 bool is_same(int xx,int yy)
34 {
35     return setfind(xx)==setfind(yy);
36 }
37 int main()
38 {
39 cin>>n>>m>>p;
40 FOR(i,1,n)
41 {cin>>x;name[x]=i;father[i]=i;rank[i]=1;}
42 FOR(i,1,m)
43 {
44     cin>>x>>y;
45     setunion(name[x],name[y]);
46 }
47 FOR(i,1,p)
48 {
49     cin>>x>>y;
50     if(is_same(name[x],name[y])) cout<<"safe"<<endl;
51     else cout<<"cc cry"<<endl;
52 }
53 return 0;
54 }
渣代码

蛋疼地在路径压缩时做了个用空间换时间的优化

/*init*/i=1-m   rank[i]=1;
//
if(X==Y) return;
    if(rank[X]==rank[Y]) {father[X]=Y;rank[Y]++;}
    else if(rank[X]>rank[Y]) father[X]=Y;
    else father[Y]=X;
//平时并的时候都是直接father[X]=Y;,汗
垃圾优化,毁我青春

UN3次才AC,粗心啊

啧,丢人啊

原文地址:https://www.cnblogs.com/mukoiaoi/p/5634401.html