HDU 1198 Farm Irrigation (并查集优化,构图)
Posted yxysuanfa
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了HDU 1198 Farm Irrigation (并查集优化,构图)相关的知识,希望对你有一定的参考价值。
本题和HDU畅通project类似。仅仅只是畅通project给出了数的连通关系,
而此题须要自己推断连通关系,即两个水管能否够连接到一起,也是本题的难点所在。
记录状态。不断combine(),注意仅仅须要推断左方和上方即可,这样不会反复推断,并且肯定都能够遍历到全部的状态。
#include<stdio.h> #include<iostream> #include<string> //记录水管的形状,每种水管用一个由‘0‘和‘1‘组成的长度为4的字符串代表, //分别表示上下左右四边是否有接口,‘0‘无,‘1‘有 char a[11][5]={"1010","1001","0110","0101","1100","0011", "1011","1110","0111","1101","1111"}; int father[51][51]; char map[51][51]; int n,m; using namespace std; int find(int x)//查找父节点,并压缩路径 { if(father[x/n][x%n]!=x) father[x/n][x%n]=find(father[x/n][x%n]); return father[x/n][x%n]; } void Union(int x,int y)//合并x,y的集合 { x=find(x); y=find(y); if(x!=y) father[y/n][y%n]=x; } void judge(int i,int j)//推断map[i][j]和它的左側和上側是否连通,如连通则合并 { if(j>0&&a[map[i][j]-‘A‘][2]==‘1‘&&a[map[i][j-1]-‘A‘][3]==‘1‘)//推断上方 Union(i*n+j,i*n+j-1); if(i>0&&a[map[i][j]-‘A‘][0]==‘1‘&&a[map[i-1][j]-‘A‘][1]==‘1‘)//推断左方 Union(i*n+j,(i-1)*n+j); } int main() { int i,j,count; while(scanf("%d%d",&m,&n)!=-1&&(n!=-1||m!=-1)) { for(i=0;i<m;i++) { scanf("%s",map[i]);//输入矩阵 for(j=0;j<n;j++) father[i][j]=i*n+j;//将父节点初始化 } for(i=0;i<m;i++) for(j=0;j<n;j++) judge(i,j); count=0;//查找父节点是本身的点的个数。即共同拥有几个集合 for(i=0;i<m;i++) for(j=0;j<n;j++) if(father[i][j]==i*n+j) count++; printf("%d\n",count); } return 0; }
以上是关于HDU 1198 Farm Irrigation (并查集优化,构图)的主要内容,如果未能解决你的问题,请参考以下文章
hdu 1198 Farm Irrigation(深搜dfs || 并查集)
Farm Irrigation HDU - 1198 (并查集)
HDU 1198 Farm Irrigation(并查集+位运算)
HDU--1198 Farm Irrigation (并查集做法+DFS做法)