codeforces 1037E. Trips(倒叙)
解题思路:
正着搞好像有点恶心。
反着搞。
一边删一边搞,从崩坏的地方开始,入度--。
最后dfs崩坏,更新答案。
注意要把边删掉防止重复崩坏。
代码:
1 #include<cstdio> 2 #include<cstring> 3 #include<algorithm> 4 struct pnt{ 5 int hd; 6 int ind; 7 bool ded; 8 }p[1000000]; 9 struct ent{ 10 int twd; 11 int lst; 12 }e[1000000]; 13 int cnt; 14 int n,m,k; 15 int lft; 16 int ans[1000000]; 17 int u[1000000],v[1000000]; 18 void ade(int f,int t) 19 { 20 cnt++; 21 e[cnt].twd=t; 22 e[cnt].lst=p[f].hd; 23 p[f].hd=cnt; 24 p[f].ind++; 25 return ; 26 } 27 void Delete(int x) 28 { 29 if(p[x].ded) 30 return ; 31 p[x].ded=true; 32 lft--; 33 for(int i=p[x].hd;i;i=e[i].lst) 34 { 35 int to=e[i].twd; 36 p[to].ind--; 37 if(p[to].ind<k) 38 Delete(to); 39 } 40 return ; 41 } 42 int main() 43 { 44 scanf("%d%d%d",&n,&m,&k); 45 for(int i=1;i<=m;i++) 46 { 47 scanf("%d%d",&u[i],&v[i]); 48 ade(u[i],v[i]); 49 ade(v[i],u[i]); 50 } 51 lft=n; 52 for(int i=1;i<=n;i++) 53 { 54 if(p[i].ind<k) 55 { 56 Delete(i); 57 } 58 } 59 for(int i=m;i;i--) 60 { 61 ans[i]=lft; 62 p[u[i]].hd=e[p[u[i]].hd].lst; 63 p[v[i]].hd=e[p[v[i]].hd].lst; 64 if(!p[v[i]].ded) 65 p[u[i]].ind--; 66 if(!p[u[i]].ded) 67 p[v[i]].ind--; 68 if(p[v[i]].ind<k) 69 Delete(v[i]); 70 if(p[u[i]].ind<k) 71 Delete(u[i]); 72 } 73 for(int i=1;i<=m;i++) 74 printf("%d\n",ans[i]); 75 return 0; 76 }