hdu 1198 dfs||并查集求连通分量个数,关键建图
来源:互联网 发布:数据库设计范式 编辑:程序博客网 时间:2024/05/21 15:04
题意:
有A~K共9种类型的地步,每耕田上方的沟渠是不合的(它们连接的出口不合)。然后由这些类型的田构成一个n*m大小的更大的田,因为相邻两个地步的沟渠可能可以相通(有接口),所以只要相通的那些地步只须要一个水源就可以了。求起码须要几许个水源。
解析:
可用bfs,dfs做,不过用并查集更便利点。 用并查集只须要断定一个田四周的四个田,若是有接口,那么就把这两个田归并成一棵树,最后断定几棵树即可。
分析:实在不会dfs啊。嗨,真心不会。。。。就是没感觉。好吧,借口太多了,掌嘴。
View Code
// I'm lanjiangzhou//C#include <stdio.h>#include <stdlib.h>#include <string.h>#include <ctype.h>#include <math.h>#include <time.h>//C++#include <iostream>#include <algorithm>#include <cstdio>#include <cstdlib>#include <cmath>#include <cstring>#include <cctype>#include <stack>#include <string>#include <list>#include <queue>#include <map>#include <vector>#include <deque>#include <set>using namespace std;//*************************OUTPUT*************************#ifdef WIN32#define INT64 "%I64d"#define UINT64 "%I64u"#else#define INT64 "%lld"#define UINT64 "%llu"#endif//**************************CONSTANT***********************#define INF 0x3f3f3f3f// aply for the memory of the stack//#pragma comment (linker, "/STACK:1024000000,1024000000")//endconst int maxn = 100+10;int n,m;//将正方形地块上的水管按照顺时针的方向标记,有为1,没有为0int a[12][4]={{1,0,0,1},{1,1,0,0},{0,0,1,1},{0,1,1,0},{1,0,1,0},{0,1,0,1},{1,1,0,1},{1,0,1,1},{0,1,1,1},{1,1,1,0},{1,1,1,1}};int maps[maxn][maxn];bool vis[maxn][maxn];//访问标记void dfs(int x,int y){ vis[x][y]=1; for(int z=0;z<4;z++){ //左 if(z==0&&a[maps[x][y]][0]&&x>=1&&a[maps[x-1][y]][2]&&!vis[x-1][y]) dfs(x-1,y); //下 else if(z==1&&a[maps[x][y]][1]&&y+1<m&&a[maps[x][y+1]][3]&&!vis[x][y+1]) dfs(x,y+1); //右 else if(z==2&&a[maps[x][y]][2]&&x+1<n&&a[maps[x+1][y]][0]&&!vis[x+1][y]) dfs(x+1,y); //上 else if(z==3&&a[maps[x][y]][3]&&y>=1&&a[maps[x][y-1]][1]&&!vis[x][y-1]) dfs(x,y-1); }}int main(){ char ch[maxn]; while(scanf("%d%d",&n,&m)!=EOF){ if(n==-1&&m==-1) break; memset(maps,0,sizeof(maps)); for(int i=0;i<n;i++){ scanf("%s",ch); for(int j=0;j<m;j++){ maps[i][j]=ch[j]-'A'; } } memset(vis,0,sizeof(vis)); int sum=0; for(int i=0;i<n;i++){ for(int j=0;j<m;j++){ if(vis[i][j]) continue; dfs(i,j); sum++; } } printf("%d\n",sum); } return 0;}
下面是并查集做的,感觉和上面一样http://www.cesclub.com/bw/jishuzhongxin/bianchengyuyan/2012/0908/39881.html
http://blog.csdn.net/fanxing1/article/details/5746377
写的都很好,嗨,不会dfs只能求人,不会建图,怎么办搜呗。
- hdu 1198 dfs||并查集求连通分量个数,关键建图
- hdu 1241 dfs求连通分量个数
- 并查集求连通分量的个数
- 连通分量个数(dfs)
- dfs hdu 1241 寻找连通分量的个数
- hdu 1232 并查集 求连通分量的个数
- (java)DFS求连通分量的个数
- 连通分量个数(连通分量_并查集)
- 并查集求连通分量的个数之hdu1213
- 并查集找连通分量的个数
- hdu 3639 Hawk-and-Chicken 【强连通分量+反向建图dfs】
- hdu 3639(强连通分量+dfs)
- DFS一个图并求出它的连通分支个数
- PAT 甲级 1021. Deepest Root(dfs:无向图的最远路径、连通分量个数)
- POJ 1562 dfs求连通分量的个数
- zoj 2412 dfs 求连通分量的个数
- POJ 1562 Oil Deposits(DFS:求八连通分量个数)
- 连通分量个数
- POJ2457 dijksta求最短路&&输出走过的路径
- POJ 3295 spfa判断是否存在负权回路
- POJ 3615 floyd 求任意起点终点的最短路
- 心心感想
- hdu 1161 kruskal求最小生成树注意建图
- hdu 1198 dfs||并查集求连通分量个数,关键建图
- 送给我最好的朋友---周辉哥
- hdu 1598 并查集+贪心---其实就是kruskal的思想
- hdu 1385 最短路+输出字典序--好题
- hdu 1143 递归
- ZOJ 2770差分约束
- hdu 1142 最短路+记忆化深搜---好题
- hdu 1548 最小生成树dijkstra,关键建图
- hdu 2680 dijkstra反向建图