Trips CodeForces - 1037E

http://codeforces.com/contest/1037/problem/E

逆向考虑 先拓扑把度数小于k的点入队列松驰其他点 最后剩下的点的数量就是最后一次查询的答案

然后逆向枚举删边 还是拓扑 把度数小于k的点入队列 删完当前这条边后 有几个点度数变为小于k 答案就减几

注意无向图拓扑时边要特判

#include 
using namespace std;

struct node1
{
    int u;
    int v;
};

struct node2
{
    int id;
    int v;
    int next;
};

queue  que;
node1 pre[200010];
node2 edge[400010];
int first[200010],degree[200010],book[200010],ans[200010],flag[200010];
int n,m,k,num;

void addedge(int id,int u,int v)
{
    edge[num].id=id;
    edge[num].v=v;
    edge[num].next=first[u];
    first[u]=num++;
}

void init()
{
    int i,id,u,v;
    for(i=1;i<=n;i++)
    {
        if(degree[i]=1;i--)
    {
        ans[i-1]=ans[i];
        if(flag[i]) continue;
        flag[i]=1;
        degree[pre[i].u]--,degree[pre[i].v]--;
        if(degree[pre[i].u]

 

你可能感兴趣的:(拓扑排序)