这些代码是挑战程序设计竞赛上的,我只是把他们串起来并调通了,如果需要详解请留言,后面我会写上去的。如果有什么错误,欢迎指教。
#include<iostream>
#include<stdio.h>
using namespace std;
int par[1000];
int rank[100];
int N=50,K=7;
int T[20]={1};
int X[20]={1};
int Y[20]={1};
void init(int n)
{
for(int i=0;i<n;i++)
{
par[i]=i;
rank[i]=0;
}
}
int find(int x)
{
if(par[x]==x)return x;
else 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);
}
void solve()
{
int ant=0,i;
init(N*3);
for(i=0;i<K;i++)
{
int t=T[i];
int x=X[i]-1;
int y=Y[i]-1;
if(x<0||x>=N||y<0||y>=N)
{
ant++;//cout<<"Or in here?"<<endl;
continue;
}
if(t==0)
{
if(same(x,y+N)||same(x,y+2*N))
{
ant++;
}
else
{
unite(x,y);
unite(x+N,y+N);
unite(x+2*N,y+2*N);
}
}
else
{
if(same(x,y)||same(x,y+2*N))
{
ant++;
}
else
{
unite(x,y+N);
unite(x+N,y+2*N);
unite(x+2*N,y);
}
}
}
cout<<ant<<endl;
}
int main()
{
T[0]=0;
T[1]=1;
T[2]=1;
T[3]=1;
T[4]=0;
T[5]=1;
T[6]=0;
X[0]=101;
Y[0]=1;
X[1]=1;
Y[1]=2;
X[2]=2;
Y[2]=3;
X[3]=3;
Y[3]=3;
X[4]=1;
Y[4]=3;
X[5]=3;
Y[5]=1;
X[6]=5;
Y[6]=5;
solve();
return 0;
}