Description
有n个点,m条无向边,给定这n个点的权值和这m条边连结的点.
求有多少个点比它只经过一条边就能到达的所有点各自的权值都更大.
Format
Input
第一行给出N,M 第二行给出N个点的权值 接下来M行,每行两个数字,代表边的情况
N,M<=1e5
Output
如题
Samples
输入数据 1
4 3
1 2 3 4
1 3
2 3
2 4
Copy
输出数据 1
2
思路:
用邻接表存树,存好后枚举所有点,找出它所有子节点,并判断它是否比它所有子节点各自的权值都更大,是则ans++,最后输出ans即可。
#include <bits/stdc++.h>
using namespace std;
int n,m,idx,t,x,y,h[1000001],vtx[1000001],nex[1000001],a[1000001],ans;
void f(int a,int b)
{
idx++;
vtx[idx] = b;
nex[idx] = h[a];
h[a] = idx;
}
int main()
{
scanf("%d%d",&n,&m);
for(int i = 1; i <= n; i++) scanf("%d",&a[i]);
memset(h,-1,sizeof(h));
for(int i = 1; i <= m; i++)
{
scanf("%d%d",&x,&y);
f(x,y);
f(y,x);
}
for(int i = 1; i <= n; i++)
{
int fl = 0,p = h[i];
while(p != -1)
{
if(a[i] <= a[vtx[p]])
{
fl = 1;
break;
}
p = nex[p];
}
if(fl == 0) ans++;
}
printf("%d",ans);
return 0;
}
/*
4 4
0 0 1
1 0 2
0 3 1
1 2 3
*/
该博客介绍了如何利用邻接表结构解决图论问题,具体为在给定n个点和m条无向边的图中,计算有多少个点的权值大于其所有直接相邻点的权值。通过遍历每个节点及其子节点,判断权值大小,最终得出满足条件的节点数量。示例代码展示了如何实现这一算法。
1265

被折叠的 条评论
为什么被折叠?



