AtCoder Beginner Contest 166 比赛人数11690 比赛开始后11分钟看到所有题
AtCoder Beginner Contest 166 C Peaks 邻接表
总目录详见https://blog.csdn.net/mrcrack/article/details/104454762
在线测评地址https://atcoder.jp/contests/abc166/tasks/abc166_c
样例构图如下
Input:
4 3
1 2 3 4
1 3
2 3
2 4
Output:
2
上述样例,可以作峰的是3,4
Input:
6 5
8 6 9 1 2 1
1 3
4 2
4 3
4 6
4 6
Output:
3
上述样例,可以作峰的是2,3,5
思路:
孤立节点,可以作峰.
节点在相邻节点中,高度最高,可以作峰.
AC代码如下
#include <stdio.h>
#define maxn 100010
struct node{
int to,next;
}e[maxn<<1];
int h[maxn],head[maxn],tot,cnt;
void add_edge(int u,int v){//邻接表
tot++,e[tot].to=v,e[tot].next=head[u],head[u]=tot;
}
int main(){
int n,m,u,v,i,b,flag1,flag2;
scanf("%d%d",&n,&m);
for(i=1;i<=n;i++)scanf("%d",&h[i]);
for(i=1;i<=m;i++){
scanf("%d%d",&u,&v);
add_edge(u,v),add_edge(v,u);//无向图
}
for(i=1;i<=n;i++){
flag1=0,flag2=0;
for(b=head[i];b;b=e[b].next){
flag1=1,v=e[b].to;
if(h[i]<=h[v]){flag2=1;break;}
}
if(!flag1)cnt++;//flag1==0表示该节点是孤立节点,可以作峰
else if(!flag2)cnt++;//flag2==0表示该节点在相邻节点中,高度最高,可以作峰
}
printf("%d\n",cnt);
return 0;
}