zoukankan      html  css  js  c++  java
  • The Largest Clique UVA

    这题  我刚开始想的是  缩点后  求出入度和出度为0 的点  然后统计个数  用总个数 减去

    然而 这样是不可以的  画个图就明白了。。。

    如果  减去度为0的点  那么最后如果出现这样的情况是不可以的

    因为 1中的点  和  3 中的点不通。。

    #include <iostream>
    #include <cstdio>
    #include <sstream>
    #include <cstring>
    #include <map>
    #include <set>
    #include <vector>
    #include <stack>
    #include <queue>
    #include <algorithm>
    #include <cmath>
    #define rap(a, n) for(int i=a; i<=n; i++)
    #define MOD 2018
    #define LL long long
    #define ULL unsigned long long
    #define Pair pair<int, int>
    #define mem(a, b) memset(a, b, sizeof(a))
    #define _  ios_base::sync_with_stdio(0),cin.tie(0)
    //freopen("1.txt", "r", stdin);
    using namespace std;
    const int maxn = 1010, INF = 0x7fffffff;
    vector<int> G[50010];
    int pre[maxn], low[maxn], sccno[maxn], dfs_clock, scc_cnt;
    int w[maxn], line[maxn][maxn], d[maxn];
    stack<int> s;
    void dfs(int u)
    {
        pre[u] = low[u] = ++dfs_clock;
        s.push(u);
        for(int i=0; i<G[u].size(); i++)
        {
            int v = G[u][i];
            if(!pre[v])
            {
                dfs(v);
                low[u] = min(low[u], low[v]);
            }
            else if(!sccno[v])
                low[u] = min(low[u], pre[v]);
        }
        if(low[u] == pre[u])
        {
            scc_cnt++;
            for(;;)
            {
                int x = s.top(); s.pop();
                sccno[x] = scc_cnt;
                if(x == u) break;
            }
        }
    }
    
    void init()
    {
        dfs_clock = scc_cnt = 0;
        mem(sccno, 0);
        mem(pre, 0);
        mem(w, 0);
        mem(d, -1);
        mem(line, 0);
        for(int i=0; i<maxn; i++) G[i].clear();
    }
    
    int dp(int u)
    {
        int& ans = d[u];
        if(ans >= 0) return ans;
        ans = w[u];      //最后一个点后边就没有点了
        for(int i=1; i<=scc_cnt; i++)
            if(u != i && line[u][i])
                ans = max(ans, dp(i) + w[u]);
        return ans;
    }
    
    
    int main()
    {
        int T;
        scanf("%d", &T);
        while(T--)
        {
            init();
            int n, m;
            scanf("%d%d", &n, &m);
            for(int i=1; i<=m; i++)
            {
                int u, v;
                scanf("%d%d", &u, &v);
                G[u].push_back(v);
            }
            for(int i=1; i<=n; i++)
                if(!pre[i])
                    dfs(i);
            for(int i=1; i<=n; i++)
            {
                w[sccno[i]]++;   //统计每个强连通分量里的点的个数
                for(int j=0; j<G[i].size(); j++)
                    line[sccno[i]][sccno[G[i][j]]] = 1;
            }
            int res = 0;
            for(int i=1; i<=scc_cnt; i++)  // 以每一个点为起点 去找最长路
                res = max(res, dp(i));
            
            printf("%d
    ", res);
    
    
        }
    
    
        return 0;
    }
    自己选择的路,跪着也要走完。朋友们,虽然这个世界日益浮躁起来,只要能够为了当时纯粹的梦想和感动坚持努力下去,不管其它人怎么样,我们也能够保持自己的本色走下去。
  • 相关阅读:
    学习java第8课:idea新建项目
    学习java第9课:IDEA注释
    淘宝专业术语
    学习java第2课:电脑常用快捷键
    学习java第7课:初识idea
    学习java第5课:java程序运行机制
    学习java第6课:Hello,World!
    学习java第4课:java 安装卸载
    学习java第3课;dos命令
    odoo命名规范及常用函数
  • 原文地址:https://www.cnblogs.com/WTSRUVF/p/9361833.html
Copyright © 2011-2022 走看看