pat甲級-1076(bfs)
阿新 • • 發佈:2018-11-18
題目連結:https://pintia.cn/problem-sets/994805342720868352/problems/994805392092020736
總結:先開始,題目沒讀懂(看來還要好好學英語)
題目大意是這樣的,微博的部落格可以被你的粉絲轉發,你的粉絲又可以轉發,就形成了一張複雜的網路。
輸入n(總人數),len(最多擴充套件的深度)輸入n行,
每行輸入一個k表示第i個人的粉絲人數,和k個人的編號,
最後輸入k然後輸入k個x詢問每次最多可以擴充套件的人數。
可以用廣搜來做,就是要注意深度的判斷。一開始我用了兩個佇列,發現超時,
後來參考了網上的程式碼,發現可以將vis變為深度,這樣既能判斷某個節點是否走過,
也能知道當前的深度,以便於結束bfs(妙啊)
#include<iostream> #include<cstdio> #include<cstring> #include<queue> using namespace std; const int maxn = 1200; int a[maxn][maxn],vis[maxn],len,n; queue <int> q; int bfs(int x) { memset(vis,-1,sizeof(vis)); int cnt=0,i,j,num=0; vis[x]=0; while(!q.empty()) q.pop(); q.push(x); while(!q.empty()) { int tp=q.front(); q.pop(); cnt=vis[tp]; if(cnt>=len) break; for(i=1;i<=n;i++) { if(vis[i]==-1&&a[tp][i]) { vis[i]=cnt+1; q.push(i); num++; } } } return num; } int main(void) { int i,j,k,x,y; scanf("%d%d",&n,&len); memset(a,0,sizeof(a)); for(i=1;i<=n;i++) { scanf("%d",&k); for(j=0;j<k;j++) scanf("%d",&x),a[x][i]=1; } scanf("%d",&k); for(j=0;j<k;j++) { scanf("%d",&x); printf("%d\n",bfs(x)); } return 0; }