51nod - 1416 两点

题目链接:1416 两点

并查集随便搞一下就过了。

 1 #include <bits/stdc++.h>
 2 using namespace std;
 3 const int maxn = 2505;
 4 int n, m;
 5 int fa[maxn];
 6 char s[55][55];
 7 //int dx[]={1, 1, 0, 0}
 8 int ety(int x, int y) {
 9     return x*m+y;
10 }
11 void init(int n) {
12     for(int i=0; i<=n; i++) {
13         fa[i] = i;
14     }
15 }
16 int get(int x) {
17     return fa[x] == x ? x : fa[x] = get(fa[x]);
18 }
19 bool join(int x, int y) {
20     int rx = get(x), ry = get(y);
21     if(rx == ry) return false;
22     fa[rx] = fa[ry] = min(rx, ry);
23     return true;
24 }
25 int main() {
26
27     while(~scanf("%d%d", &n, &m)) {
28         getchar();
29         for(int i=0; i<n; i++) {
30             gets(s[i]);
31         }
32         init(n*m);
33         bool ok = true;
34         for(int i=0; i<n; i++) {
35             for(int j=0; j<m; j++) {
36                 if(i!=n-1 && s[i][j] == s[i+1][j]) ok = join(ety(i, j), ety(i+1, j));
37                 if(!ok) break;
38                 if(j!=m-1 && s[i][j] == s[i][j+1]) ok = join(ety(i, j), ety(i, j+1));
39                 if(!ok) break;
40             }
41             if(!ok) break;
42         }
43         if(ok) printf("No\n");
44         else printf("Yes\n");
45     }
46     return 0;
47 }
时间: 2024-10-08 06:38:50

51nod - 1416 两点的相关文章

51nod 1416 两点 dfs

1416 两点 题目来源: CodeForces 基准时间限制:1 秒 空间限制:131072 KB 分值: 20 难度:3级算法题  收藏  关注 福克斯在玩一款手机解迷游戏,这个游戏叫做”两点”.基础级别的时候是在一个n×m单元上玩的.像这样: 每一个单元有包含一个有色点.我们将用不同的大写字母来表示不同的颜色. 这个游戏的关键是要找出一个包含同一颜色的环.看上图中4个蓝点,形成了一个环.一般的,我们将一个序列 d1,d2,...,dk 看成一个环,当且仅当它符合下列条件时: 1.    这

1416 两点

#include<iostream> #include<cstdio> #include<cstring> using namespace std; char map[55][55]; int v[55][55]; int flag; int n,m; int dir [4][2]={0,1,1,0,0,-1,-1,0}; void dfs(int x,int y,int d,char f) { if(x>n||x<0||y<0||y>m||ma

51nod 1380 夹克老爷的逢三抽一 堆 脑洞题

51nod 1380 夹克老爷的逢三抽一堆 脑洞题 题意 n个人围成一圈 然后每次可以选一个人,得到他的分数,然后他与他相邻的两个人出圈 总共选 n/3次, 保证n是3的倍数 题解 这道怎么说呢,应该比较巧妙吧,你开一个优先队列,大根堆,每次选择优先队列中最大的数,然后把他左右两个数删掉,比如 A B C 删掉 B ,那么就把 A+C-B 加入优先队列中,这其实就是相当于提供了一个后悔的机会,就像网络流中的反向边,如果在选中这个点的话,就相当于 B+(A+C-B) 然后就相当于 B 这个点 不选

51nod 配对(求树的重心)

传送门:http://www.51nod.com/onlineJudge/questionCode.html#!problemId=1737 给出一棵n个点的树,将这n个点两两配对,求所有可行的方案中配对两点间的距离的总和最大为多少. Input 一个数n(1<=n<=100,000,n保证为偶数) 接下来n-1行每行三个数x,y,z表示有一条长度为z的边连接x和y(0<=z<=1,000,000,000) Output 一个数表示答案 Input示例 6 1 2 1 1 3 1

ios根据gps坐标来计算两点间的距离

//ios根据gps坐标来计算两点间的距离 //x1,y1 点1的坐标 x2,y2点2的坐标 -(double) gps2m:(double)x1 _y1:(double)y1 _x2:(double)x2 _y2:(double)y2{ double radLat1 = (x1 * 3.1416 / 180.0); double radLat2 = (x2 * 3.1416 / 180.0); double a = radLat1 - radLat2; double b = (y1 - y2)

n个点中求任意两点组成斜率的最大值

http://www.51nod.com/onlineJudge/questionCode.html#!problemId=1100 首先按x坐标排序,然后相邻的三个点A,B,C 组成的三条直线必然有K(AC)<max(K(A,B),K(B,C));(K是斜率) 所以斜率一定会在相邻的两点中产生,排序O(nlogn),更新最大值O(n). 1 #include <iostream> 2 #include <cstdio> 3 #include <cmath> 4

UVA 1416 - Warfare And Logistics(最短路树)

UVA 1416 - Warfare And Logistics 题目链接 题意:给定一个无向图,每个边一个正权,c等于两两点最短路长度之和,现在要求删除一边之后,新图的c值最大的是多少 思路:直接枚举删边,每次做一次dijkstra的话复杂度太高,其实如果建好最短路树,如果删去的边在最短路树上,才需要去做,这样复杂度就优化到(n^2mlog(n)),勉强可以接受 代码: #include <cstdio> #include <cstring> #include <vecto

51nod 1201 整数划分(dp)

题目链接:https://www.51nod.com/onlineJudge/questionCode.html#!problemId=1201 题解:显然是一道dp,不妨设dp[i][j]表示数字i分成j个一共有几种分法. 那么转移方程式为: dp[i][j] = dp[i - 1][j] + dp[i - 1][j - 1] 表示将i - 1划分为j个数,然后j个数都+1 还是不重复,将i - 1划分为j - 1个数,然后j - 1个数都+1,再加上1这个数. 然后就是j的范围要知道1+2+

计算两点间的距离

计算两点间的距离 Time Limit: 2000/1000 MS (Java/Others)    Memory Limit: 65536/32768 K (Java/Others)Total Submission(s): 208295    Accepted Submission(s): 72641 Problem Description 输入两点坐标(X1,Y1),(X2,Y2),计算并输出两点间的距离. Input 输入数据有多组,每组占一行,由4个实数组成,分别表示x1,y1,x2,y