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 }

猜你喜欢

转载自www.cnblogs.com/blog-Dr-J/p/9857962.html