UVALive 3977 BFS染色

这个题意搞了半天才搞明白 就是如果定义一个d-summit,即从该点到另一个更高的点,经过的路径必定是比当前点低至少d高度的,如果该点是最高点,没有比他更高的,就直接视为顶点 其实就是个BFS染色,先按降序排序,然后每个点对其可到达的点染色,h-d的点为边界,走到这里就不用往下染了 然后其他店染色的时候若产生冲突,则非d—summit,否则该点为顶点 今天还有COJ上一个BFS染色的题目,一直TLE。。。还没弄出来

#include <iostream>
#include <cstdio>
#include <cstring>
#include <queue>
#include <algorithm>
using namespace std;
int mat[510][510];
int n,m,d,cnt;
struct node{
    int x,y,h;
    bool operator <(const node& rhs)const{
        return h>rhs.h;
    }
}P[510*500];
int dir[][2]={{0,1},{0,-1},{1,0},{-1,0}};
int vis[510][510];
int ans;
inline void bfs(int x)
{
    node a=P[x];
    int flag=1;
    int tot=1;
    if (vis[a.x][a.y]!=-1){
        flag=0;
        return;
    }
    else vis[a.x][a.y]=a.h;
    queue<node> q;
    q.push(a);
    int sh=a.h;
    int lh=a.h-d;
    while (!q.empty())
    {
        node u=q.front();
        q.pop();
        for (int i=0;i<4;i++){
            node np;
            np.x=u.x+dir[i][0];
            np.y=u.y+dir[i][1];
            np.h=mat[np.x][np.y];
            if (np.x>=n || np.y>=m || np.x<0 ||np.y<0) continue;
            if (np.h<=lh) continue;
            if (vis[np.x][np.y]!=-1){
                if (vis[np.x][np.y]!=sh) flag=0;
                continue;
            }
            vis[np.x][np.y]=sh;
            if (np.h==sh) tot++;
            q.push(np);
        }
    }
    if (flag==1) ans+=tot;
}
int main()
{
    int t;
    scanf("%d",&t);
    while (t--)
    {
        cnt=0;
        scanf("%d%d%d",&n,&m,&d);
        for (int i=0;i<n;i++)
        {
            for (int j=0;j<m;j++){
                scanf("%d",&mat[i][j]);
                P[cnt].x=i;
                P[cnt].y=j;
                P[cnt++].h=mat[i][j];
            }
        }
        sort(P,P+n*m);
        memset(vis,-1,sizeof vis);
        ans=0;
        for (int i=0;i<n*m;i++)
        {
            bfs(i);
        }
        printf("%d\n",ans);
    }
    return 0;
}

  

UVALive 3977 BFS染色

时间: 2024-10-17 23:55:15

UVALive 3977 BFS染色的相关文章

UVALive 6663 Count the Regions 离散+bfs染色_(:зゝ∠)_

题目链接:点击打开链接 gg..== #include <cstdio> #include <cstring> #include<iostream> #include <queue> #include <set> #include <map> #include <algorithm> #include <string> using namespace std; #define ll long long #def

XMU 1617 刘备闯三国之汉中之战 【BFS+染色】

1617: 刘备闯三国之汉中之战 Time Limit: 1000 MS  Memory Limit: 128 MBSubmit: 6  Solved: 5[Submit][Status][Web Board] Description 刘备(161年-223年6月10日),字玄德,东汉末年幽州涿郡涿县,西汉中山靖王刘胜的后代.刘备一生极具传奇色彩,早年颠沛流离.备尝艰辛最终却凭借自己的谋略终成一方霸主.那么在那个风云激荡的年代,刘备又是如何从一个卖草鞋的小人物一步一步成为蜀汉的开国皇帝呢?让我们

UVALive 3977

直接搜索,简单题: #include<cstdio> #include<cstring> #include<cmath> #include<algorithm> #include<queue> #define maxn 505 #define ll long long using namespace std; int map[maxn][maxn]; int dir[4][2]={{0,1},{1,0},{0,-1},{-1,0}}; int v

UVALive - 3977 Summits (BFS染色)

题目大意:坑爹的题目,题意那么难理解. 讲的就是,如果该点是山顶的话(高度为h),那么以该点为中心,往外辐射,走高度大于h-d的点,到达不了另一个比它高的点 这就提示了,高度要从大到小排序,依次以高的点(假设高度为h)为核心辐射,如果碰上高度小于等于h-d的,表示此路不通了,就在该处停止 反之,如果碰上高度大于h-d的,且没有被染色过的,那么就将其染色 如果碰上高度大于h-d的,且被染色的话,就表明可以走到另一个更高点了,那么此点就不是山顶了 如果中途碰到了和该点一样高的,那么山顶的数量就加1

BFS(染色) LA 3977 Summits

题目传送门 题意:题意坑爹.问符合条件的的山顶个数 分析:降序排序后从每个点出发,假设为山顶,如果四周的点的高度>h - d那么可以走,如果走到已经走过的点且染色信息(山顶高度)不匹配那么就不是山顶.重点在于就算知道不是山顶也要染色完. #include <bits/stdc++.h> using namespace std; const int N = 5e2 + 5; const int INF = 0x3f3f3f3f; int h, w, d; struct Point { in

Hdu 5285 wyh2000 and pupil (bfs染色判断奇环) (二分图匹配)

题目链接: BestCoder Round #48 ($) 1002 题目描述: n个小朋友要被分成两班,但是有些小朋友之间是不认得的,所以规定不能把不认识的小朋友分在一个班级里面,并且一班的人数要比二班的人数多,每个班的人数都大于零. 解题思路: hdu给出的题解是二分图匹配加上贪心,就不多说了. 还可以用bfs对节点染色,建好图后,对节点进行bfs分成,偶数成与奇数成染成不同的颜色,颜色相同的节点都可以分到同一个集合里面,但是要判断一下奇环,如果出现奇环的话,是无法进行分组的.在每次bfs的

LightOJ1009---Back to Underworld (bfs染色)

The Vampires and Lykans are fighting each other to death. The war has become so fierce that, none knows who will win. The humans want to know who will survive finally. But humans are afraid of going to the battlefield. So, they made a plan. They coll

CF796D Police Stations BFS+染色

类似贪心,用 BFS 对树进行染色,然后枚举哪些边的两个端点颜色不同. code: #include <bits/stdc++.h> #define N 300006 #define setIO(s) freopen(s".in","r",stdin) using namespace std; vector<int>G; queue<int>q; int n,k,d,edges,vis[N],hd[N],to[N<<1

UVALive 7297 bfs

题意 一个小偷偷到了项链 他想知道自己是否可以逃出去 地图中有一个小偷 一个警察 警察有一条狗 一开始 小偷和警察的移动速度都是1 当警察走到小偷经过过的地方时 警察会有一条狗嗅到小偷的气味并且以2的速度去追 由于问题问的是 小偷是否必定有方法逃出 所以我们可以看作 有无限个警察从一个点出发去抓小偷 每经过一个点 这个点上就会有一个警察站着 所以会有一个limit来记录警察到达这个点的最短的时间 我们可以想到 小偷到这个点的时间和警察到达这个点的时间的差 就是小偷到这个点之后可以行动的时间(如果