Portal:http://codevs.cn/problem/2639/
简单题,并查集再加个map,一开始我以为要用图论,失算
FML,我的代码怎么这么长。。。优化太多反而慢啊。。。大常数大师啊。。。
![](https://i-blog.csdnimg.cn/blog_migrate/8f900a89c6347c561fdf2122f13be562.gif)
![](https://i-blog.csdnimg.cn/blog_migrate/961ddebeb323a10fe0623af514929fc1.gif)
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 }
蛋疼地在路径压缩时做了个用空间换时间的优化
![](https://i-blog.csdnimg.cn/blog_migrate/8f900a89c6347c561fdf2122f13be562.gif)
![](https://i-blog.csdnimg.cn/blog_migrate/961ddebeb323a10fe0623af514929fc1.gif)
/*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,粗心啊
啧,丢人啊