思路
图论 链式前向星
这题太水了,学过图论的不会做都对不起你自己。
很简单,我们可以先用邻接表把这个图给储存下来(运用链式前向星来储实现邻接表)。 然后枚举每个点,再枚举每个点可以到达的其他点。如果第一层循环枚举的点小于等于第二层循环枚举的点,则直接跳出循环,因为这个点已经不符合要求了。如果如果第一层循环枚举的点大于第二层循环枚举的所有点,则最终答案加一。
最后,直接输出最终答案。(记得换行)
代码
#include<iostream>
using namespace std;
//定义变量和邻接表
int n,m;
int fst[1000005];
int cnt;
int ans;
struct node
{
int u,nxt;
}arr[1000005];
void adds(int x,int y)
{
arr[++cnt].u=y,arr[cnt].nxt=fst[x],fst[x]=cnt;
}
int a[100005];
int tot;
int main()
{
//输入
cin>>n>>m;
for(int i=1;i<=n;++i)
{
cin>>a[i];
}
for(int i=1;i<=m;++i)
{
int x,y;
cin>>x>>y;
adds(x,y);
adds(y,x);
}
//枚举点
for(int i=1;i<=n;++i)
{
tot=0;
for(int j=fst[i];j;j=arr[j].nxt)
{
if(a[i]<=a[arr[j].u])
{
//如果小于,跳出循环
tot=1;
break;
}
}
if(!tot)//如果没有跳出循环,ans++
ans++;
}
//输出
cout<<ans<<endl;
}