9/16腾讯研发岗笔试编程题第二题
腾讯笔试9/16研发岗第二题,求重要的点的个数。
正向建图搜一下,然后反向建图搜一下,用一个out数组存能到的这个点个数,正向搜的时候++,反向搜的时候--,最后如果大于0就可以。
#include <cstdio> #include <cstring> #include <cmath> #include <algorithm> #include <vector> #include <string> #include <map> #include <set> #include <cassert> #include <queue> #define inf 0x3fffffff using namespace std; const int maxn=2010; int first[maxn],sign; int out[maxn],vis[maxn]; queue<int>q; struct node1{ int u,v; }e[maxn]; struct node { int to,w,next; }edge[maxn]; void creat(){ for(int i=0;i<maxn;i++) first[i]=0; sign=1; } void add_edge(int u,int v){ edge[sign].to=v; edge[sign].next=first[u]; first[u]=sign++; } void bfs(int s){ q.push(s); while(!q.empty()){ int top=q.front(); q.pop(); for(int i=first[top];i;i=edge[i].next){ int to=edge[i].to; if(vis[to])continue; out[to]++; q.push(to); } } } void bfs1(int s){ q.push(s); while(!q.empty()){ int top=q.front(); q.pop(); for(int i=first[top];i;i=edge[i].next){ int to=edge[i].to; if(vis[to])continue; out[to]--; q.push(to); } } } int main(){ int n,m; int u,v; creat(); scanf("%d %d",&n,&m); for(int i=0;i<m;i++){ scanf("%d %d",&u,&v); e[i].u=u; e[i].v=v; if(u==v)continue; add_edge(u,v); } for(int i=1;i<=n;i++){ memset(vis,0,sizeof(vis)); vis[i]=1; bfs(i); } creat(); for(int i=0;i<m;i++){ v=e[i].v; u=e[i].u; if(u==v)continue; add_edge(v,u); } for(int i=1;i<=n;i++){ memset(vis,0,sizeof(vis)); vis[i]=1; bfs1(i); } int sum=0; for(int i=1;i<=n;i++){ if(out[i]>0) sum++; } printf("%d\n",sum); return 0; }
#笔试题目##腾讯#