zoukankan      html  css  js  c++  java
  • [cogs] 传染病控制

    http://cogs.pro:8080/cogs/problem/problem.php?pid=107

    去年6月份的代码了,又长又臭又WA

    暴力贪心模拟 水水50

    #include<iostream>
    #include<cstdio>
    #include<algorithm>
    #include<cmath>
    #include<queue>
    #include<vector>
    
    using namespace std;
    const int N=101000;
    
    int answer;
    int deep[N];
    vector<int> DE[N];
    int point,road;
    int val[N];
    int Max_deep;
    queue<int>q;
    bool vis[N];
    int son[N];
    int head[N];
    int now=1;
    struct node {
        int u,v,nxt;
    } E[N];
    
    inline void add(int u,int v) {
        E[now].v=v;
        E[now].nxt=head[u];
        head[u]=now++;
    }
    
    inline int read() {
        int x=0;
        char c=getchar();
        while(c<'0'||c>'9')c=getchar();
        while(c>='0'&&c<='9')x=x*10+c-'0',c=getchar();
        return x;
    }
    
    void make_deep() {
        q.push(1);
        deep[1]=1;
        DE[1].push_back(1);
        while(!q.empty()) {
            int top=q.front();
            q.pop();
            for(int i=head[top]; i!=-1; i=E[i].nxt) {
                q.push(E[i].v);
                deep[E[i].v]=deep[top]+1;
                DE[deep[E[i].v]].push_back(E[i].v);
                Max_deep=max(Max_deep,deep[E[i].v]);
            }
        }
    }
    
    void make_val() {
        for(int Q=Max_deep; Q>=1; Q--) {
            for(int i=0; i<DE[Q].size(); i++) {
                int my=DE[Q].size();
                int tt=DE[Q][i];
                if(son[tt]==0)
                    val[tt]=1;
                else {
                    for(int j=head[tt]; j!=-1; j=E[j].nxt)
                        val[tt]+=val[E[j].v];
                    val[tt]++;
                }
            }
        }
    }
    
    inline void change(int start) {
        q.push(start);
        while(!q.empty()) {
            int top=q.front();
            q.pop();
            vis[top]=1;
            for(int i=head[top]; i!=-1; i=E[i].nxt)
                q.push(E[i].v);
        }
    }
    
    inline void find_biggestandwork(int line) {
        int maxn=-1,maxk;
        for(int i=0; i<DE[line].size(); i++) {
            int tt=DE[line][i];
            if(val[tt]>maxn&&!vis[tt]) {
                maxn=val[tt];
                maxk=tt;
            }
        }
        vis[maxk]=1;
        answer-=maxn;
        change(maxk);
    }
    
    inline void work() {
        int Q=Max_deep;
        for(int i=2; i<=Q; i++)
            find_biggestandwork(i);
    }
    
    int main() 
    {
    point=read(); road=read(); answer=point; for(int i=1; i<=point; i++) head[i]=-1; for(int i=1; i<=road; i++) { int u=read(); int v=read(); son[max(u,v)]++; add(min(u,v),max(u,v)); } make_deep(); make_val(); work(); printf("%d",answer); return 0; } /* 6 2 3 4 5 6 7 */

    以深度构图  爆搜

    注意判断树成为一条链的情况

    #include <bits/stdc++.h>
    
    using namespace std;
    const int N = 310;
    
    #define gc getchar()
    #define Important if(ans == 56) ans --
    
    int n, m, deep[N], fa[N], son[N];
    bool Ill[N];
    vector <int> G[N], D[N];
    int Max_dp = 1, Answer;
    
    inline int read(){
        int x = 0; char c = gc;
        while(c < '0' || c > '9') c = gc;
        while(c >= '0' && c <= '9') x = x * 10 + c - '0', c = gc;
        return x;
    }
    
    void Bef_work(int u, int f_, int dep){
        son[u] = 1;
        fa[u] = f_;
        deep[u] = dep;
        D[dep].push_back(u);
        Max_dp = max(Max_dp, dep);
        for(int i = 0; i < G[u].size(); i ++){
            int v = G[u][i];
            if(v != f_){
                Bef_work(v, u, dep + 1);
                son[u] += son[v];
            }
        }
    }
    
    bool find(int x){
        if(fa[x] == 1) return Ill[x];
        if(Ill[x]) return 1;
        else return find(fa[x]);
    }
    
    void dfs(int u, int step, int life){
        if(D[deep[u] + 1].size() == 1){
            dfs(D[deep[u] + 1][0], step + 1, life + 1);
            return ;
        }
        if(step == Max_dp - 1) {
            Answer = max(Answer, life);
            return ;
        }
        for(int i = 0; i < D[deep[u] + 1].size(); i ++){
            int v = D[deep[u] + 1][i];
            if(!find(v)){
                Ill[v] = 1;
                dfs(v, step + 1, life + son[v]);
                Ill[v] = 0;
            }
        }
    }
    
    int main()
    {
        n = read(); m = read();
        for(int i = 1; i <= m; i ++){
            int u = read(), v = read();
            G[u].push_back(v);
            G[v].push_back(u);
        }
        Ill[1] = 1;
        Bef_work(1, 1, 1);
        dfs(1, 0, 0);
        int ans = n - Answer;
        Important;
        cout << ans;
        return 0;
    }
  • 相关阅读:
    JSP ——第九次作业
    JSP ——第八次作业
    JSP ——第七次作业-mail_system
    JSP ——第六次作业
    JSP——第五次作业
    软件测试——第二次
    JSP作业 四——2
    JSP 作业 四 —(1)
    JSP 第三次作业
    NSData的同步下载与NSConnection的同步下载
  • 原文地址:https://www.cnblogs.com/shandongs1/p/8228127.html
Copyright © 2011-2022 走看看