8 条题解
-
3
刚学了博主的并查集,用并查集做了一下
//#include <iostream> //#include <queue> //using namespace std; //typedef pair<int,int> PII; //int dx[]={1,0,-1,0}; //int dy[]={0,-1,0,1}; //const int N=510; //int board[N][N]; //bool stu[N][N]; //int n; //bool bfs(int x,int y){ // if(!board[x][y]) return false; // if(stu[x][y]) return false; // queue<PII> q; // q.push({x,y}); // stu[x][y]=true; // while(!q.empty() ){ // PII temp=q.front() ; // q.pop() ; // for(int i=0; i<4; i++){ // int a=temp.first +dx[i], // b=temp.second +dy[i]; // if(a<1 || a>n || b<1 || b>n) continue; // if(!board[a][b]) continue; // if(stu[a][b]) continue; // stu[a][b]=true; // q.push({a,b}); // } // // // // // } // // return true; // // // // // // // // //} // // // //int main() //{ // // ios::sync_with_stdio(false); // cin.tie(0); // cin>>n; // for(int i=1; i<=n; i++){ // for(int j=1; j<=n; j++){ // cin>>board[i][j]; // } // } // // int ans=0; // // for(int i=1; i<=n; i++){ // for(int j=1; j<=n; j++){ // if(bfs(i,j)) ans++; // } // } // cout<<ans<<endl; // // // return 0; //} //并查集 #include <iostream> using namespace std; const int N=510; int dx[]={1,0,-1,0}; int dy[]={0,1,0,-1}; int board[N][N]; int n; int f[N*N]; int find(int x){ if(f[x]==x) return x; else return f[x]=find(f[x]); } void merge(int x,int y){ x=find(x); y=find(y); if(x!=y){ f[y]=x; } } bool same(int x,int y){ return find(x)==find(y); } //坐标转换 int change(int x,int y){ return (x-1)*n+y; } int main(){ ios::sync_with_stdio(false); cin.tie(0); cin>>n; for(int i=1; i<=n; i++){ for(int j=1; j<=n; j++) { cin>>board[i][j]; f[change(i,j)]=change(i,j); } } for(int i=1; i<=n; i++){ for(int j=1; j<=n; j++){ if(!board[i][j]) continue; for(int k=0; k<4; k++){ int a=i+dx[k], b=j+dy[k]; if(!board[a][b]) continue; merge(change(i,j),change(a,b)); } } } int ans=0; for(int i=1; i<=n; i++){ for(int j=1; j<=n; j++){ if(!board[i][j]) continue; if(find(change(i,j)) == change(i,j)) ans++; } } cout<<ans <<endl; return 0; }
信息
- ID
- 33
- 时间
- 1000ms
- 内存
- 256MiB
- 难度
- 普及−
- 标签
- 递交数
- 443
- 已通过
- 185
- 上传者