1. 程式人生 > >codeforces 1037E. Trips(倒敘)

codeforces 1037E. Trips(倒敘)

傳送門 true bool scanf 題目 ade return 重復 code

題目傳送門:

解題思路:

正著搞好像有點惡心。

反著搞。

一邊刪一邊搞,從崩壞的地方開始,入度--。

最後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 }

codeforces 1037E. Trips(倒敘)