2了,差点就A了。。。这题真心不难,开始想的就是暴力spfa就可以,直接来了一次询问,就来一次的那种,TLE了,想了想,存到栈里会更快,交又TLE了。。无奈C又被cha了,我忙着看C去了。。。这题,是我一个地方写错了。。top = 0的时候会死循环吗?貌似不会把,反正我加了这个判断,就A了,可能优化了一下把。
1 #include <cstring> 2 #include <cstdio> 3 #include <string> 4 #include <iostream> 5 #include <algorithm> 6 #include <cmath> 7 #include <queue> 8 using namespace std; 9 #define INF 1000000 10 int first[200001]; 11 int dis[200001]; 12 int in[200001]; 13 int s[200001]; 14 int n,t,top; 15 struct node 16 { 17 int u,v,next; 18 }edge[300001]; 19 void CL() 20 { 21 t = 0; 22 memset(first,-1,sizeof(first)); 23 } 24 void add(int u,int v) 25 { 26 edge[t].u = u; 27 edge[t].v = v; 28 edge[t].next = first[u]; 29 first[u] = t ++; 30 } 31 void spfa() 32 { 33 int i,u,v; 34 for(i = 1;i <= n;i ++) 35 in[i] = 0; 36 queue<int>que; 37 for(i = 0;i < top;i ++) 38 { 39 in[s[i]] = 1; 40 dis[s[i]] = 0; 41 que.push(s[i]); 42 } 43 while(!que.empty()) 44 { 45 u = que.front(); 46 que.pop(); 47 in[u] = 0; 48 for(i = first[u];i != -1;i = edge[i].next) 49 { 50 v = edge[i].v; 51 if(dis[v] > dis[u] + 1) 52 { 53 dis[v] = dis[u] + 1; 54 if(!in[v]) 55 { 56 in[v] = 1; 57 que.push(v); 58 } 59 } 60 } 61 } 62 return ; 63 } 64 int main() 65 { 66 int m,i,u,v; 67 CL(); 68 scanf("%d%d",&n,&m); 69 for(i = 1;i < n;i ++) 70 { 71 scanf("%d%d",&u,&v); 72 add(u,v); 73 add(v,u); 74 } 75 for(i = 1;i <= n;i ++) 76 dis[i] = INF; 77 top = 1; 78 s[0] = 1; 79 spfa(); 80 top = 0; 81 for(i = 1;i <= m;i ++) 82 { 83 scanf("%d%d",&u,&v); 84 if(u == 1) 85 { 86 s[top ++] = v; 87 } 88 else 89 { 90 if(top != 0)//这里 91 spfa(); 92 top = 0; 93 printf("%d ",dis[v]); 94 } 95 } 96 return 0; 97 }