CF1037E. Trips

题目链接

CF1037E. Trips

题解

每次删点后,对不满足要求的点拓扑

代码

#include<map> 
#include<queue> 
#include<vector> 
#include<cstdio> 
#include<algorithm> 
#define rep(a,b,c) for(int a = b;a <= c;++ a) 
#define gc getchar()
#define pc putchar
inline int read() { 
    int x = 0,f = 1; 
    char c = gc; 
    while(c < '0' || c > '9') c = gc; 
    while(c <= '9' && c >= '0') x = x * 10 + c - '0',c = gc; 
    return x * f; 
} 
void print(int x) { 
    if(x < 0) { 
        pc('-'); 
        x = -x; 
    } 
    if(x >= 10) print(x / 10); 
    pc(x % 10 + '0'); 
} 
const int maxn = 5000007; 
int n,m,k; 
int d[maxn]; 
bool del[maxn]; 
using namespace std; 
#define pr pair<int,int> 
#define mmp make_pair
map<pr,int> mp; 
struct node { 
    int v,next; 
} edge[maxn]; 
int head[maxn],num = 0; 
inline void add_edge(int u,int v) { 
    edge[++ num].v = v; edge[num].next = head[u];head[u] = num; 
} 
int ans; 
int u[maxn],v[maxn]; 
int Ans[maxn]; 
queue<int>q;        
void solve(int x) {
    if(d[x] >= k || del[x]) return; 
    del[x] = 1; 
    q.push(x); 
    ans --; 
    while(!q.empty()) { 
        int U = q.front(); 
        q.pop(); 
        for(int i = head[U];i;i = edge[i].next) { 
            int V = edge[i].v; 
            if(del[V]) continue; 
            if(mp.count(mmp(U,V)) == 0) d[V] --; 
            if(d[V] < k) { del[V] = true;ans --; q.push(V);}
        } 
    } 
} 
int main() { 
    n = read(),m = read(); k = read();  
    rep(i,1,m) { 
        u[i] = read(),v[i] = read(); 
        add_edge(u[i],v[i]); 
        add_edge(v[i],u[i]); 
        d[v[i]] ++;  
        d[u[i]] ++; 
    } 
    ans = n; 
    rep(i,1,n) 
        solve(i); 
    mp.clear(); 
    for(int i = m;i >= 1;-- i) {    
        Ans[i] = ans; 
        if(!del[u[i]]) d[v[i]] -- ; 
        if(!del[v[i]]) d[u[i]] -- ; 
        mp[pr(u[i],v[i])] = 1; 
        mp[pr(v[i],u[i])] = 1; 
        solve(u[i]); 
        solve(v[i]); 
    } 
    rep(i,1,m)print(Ans[i]),pc('\n'); 
} 

/* 
500 2 3
58 102
250 411
*/ 

转载于:https://www.cnblogs.com/sssy/p/9904312.html

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值