食物链POJ1182
1,有答案咱就先看看省时间。毕竟以后没答案的题目多的是。
2,还是有的东西的吧。
3,我先把这代码风格修改下,太长了,
修改前,97lines。
修改后,56lines。
近三分之一的行数。。。
并查集当个模板再看吧。
void init(int n){ for(int i=0;i<n;i++){fa[i]=i;rank[i]=0;//不对我这个初始化还跟题目有关的 } } int find(int x){ if(fa[x]==x) return x; else return fa[x]=find(fa[x]); } void unite(int x,int y) { x=find(x); y=find(y); if(x==y) return ; if(rank[x]<rank[y]) fa[x]=y; else{fa[y]=x; if(rank[x]==rank[y]) rank[x]++; } }
bool same(int x,int y) return find(x)==find(y);你这样还不行的!
bool same(int x,int y)
{
return find(x)==find(y);}
4,懂了一点,但是不是很清晰。
#include<iostream> using namespace std; int n,k,T[1005],X[1005],Y[1005]; int fa[1005],rank[1005]; int ans=0; void init(int n){ for(int i=0;i<n;i++){fa[i]=i;rank[i]=0; } } int find(int x){ if(fa[x]==x) return x; else return fa[x]=find(fa[x]); } void unite(int x,int y) { x=find(x); y=find(y); if(x==y) return ; if(rank[x]<rank[y]) fa[x]=y; else{fa[y]=x; if(rank[x]==rank[y]) rank[x]++; } } bool same(int x,int y) { return find(x)==find(y); } int main(){ cin>>n>>k; for(int i=0;i<k;i++){cin>>T[i];cin>>X[i];cin>>Y[i]; } init(n*3); for(int i=0;i<k;i++){ int t=T[i]; int x=X[i]-1; int y=Y[i]-1; //变成了0到n-1的范围 if(x<0||x>=n||y<0||y>=n){ans++; continue;} if(t==1){ if(same(x,y+n)||same(x,y+2*n)) ans++; else{ unite(x,y); unite(x+n,y+n); unite(x+n*2,y+n*2); } } else{ if(same(x,y)||same(x,y+2*n)) ans++; else{ unite(x,y+n); unite(x+n,y+2*n); unite(x+2*n,y); } } } cout<<ans<<endl; }
5,不是很难懂,但是思想都很好。
直接错误的话,没有continue问题比较大。
6,顺便把并查集复习下也好,
害,果然出问题喽,
日。
7,费大费小来下!!!
费大??其实人家也讲的很好了。是维护动物之间的关系。。而且因为N,K很大的情况下,你还得高效地维护这些东西。
并且人家也说了用并查集,同时并查集不就是高效地维护各种各样的关系么。但是但是,
并查集是维护同一组的数据结构。但是这个,我来给你想想。。。有个什么ABC的关系,但是还跟数字啥的关系比较大。除了什么同一类,还有捕食关系存在。
难啊难,我费大不出来我给你直说吧。
我敲~~~~~~~我敲!!!!!