• 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
    ",count);
    	}
    	return 0;
    }
    


  • 相关阅读:
    JS---案例:拖曳对话框
    关于选用ccflow你所担心的问题都在这里为您解答
    Elasticsearch(GEO)数据写入和空间检索
    echart的legend不显示问题
    html5+css3的神奇搭配
    h5+css3+Jq
    初探 jQuery
    在vi编辑器中如何向上翻页,向下翻页以及查询“ab”
    webpack4 特性
    webpack4配置
  • 原文地址:https://www.cnblogs.com/yxysuanfa/p/6971697.html
Copyright © 2020-2023  润新知