https://vjudge.net/problem/UVA-11324

给定一张有向图G,求一个节点数目最大的节点集,使得该集合中的任意两个节点u和v满足:要么u可以到达v,要么v可以到达u(u,v相互可达也算满足),要求输出最大的节点数

Given a directed graph G, consider the following transformation. First, create a new graph T(G) to have the same vertex set as G. Create a directed edge between two vertices u and v in T(G) if and only if there is a path between u and v in G that follows the directed edges only in the forward direction. This graph T(G) is often called the transitive closure of G. We define a clique in a directed graph as a set of vertices U such that for any two vertices u and v in U, there is a directed edge either from u to v or from v to u (or both). The size of a clique is the number of vertices in the clique.

Input The number of cases is given on the first line of input. Each test case describes a graph G. It begins with a line of two integers n and m, where 0 ≤ n ≤ 1000 is the number of vertices of G and 0 ≤ m ≤ 50, 000 is the number of directed edges of G. The vertices of G are numbered from 1 to n. The following m lines contain two distinct integers u and v between 1 and n which define a directed edge from u to v in G.

Output For each test case, output a single integer that is the size of the largest clique in T(G).

Sample Input 1 5 5 1 2 2 3 3 1 4 1 5 2

Sample Output 4

 #include<iostream>
 #include<cstdio>
 #include<vector>
 #include<cstring>
 using namespace std;
 ;
 struct Edge{
     int go,next;
 };
 struct InputEdge{
     int from,to;
 };
 int T,a,b,n,m,book[maxn],bcc_count,v[maxn],end[maxn],end2[maxn],map[maxn][maxn],bcc_node[maxn],mem[maxn];
 vector<int> G[maxn],G2[maxn];
 vector<InputEdge> inputedge;
 vector<int> S;
 void init(){
     memset(v,,sizeof(v));
     memset(book,,sizeof(book));
     bcc_count=;
     //memset(end,0,sizeof(end));
     //memset(end2,0,sizeof(end2));
     S.clear();
     ;i<=n;i++){
         G[i].clear();
         G2[i].clear();
     }
     memset(map,,sizeof(map));
     inputedge.clear();
     memset(bcc_node,,sizeof(bcc_node));
     memset(mem,,sizeof(mem));
 }
 void add(int from,int to){
     //Edge e;e.go=to;e.next=end[from];G.push_back(e);end[from]=G.size()-1;
     G[from].push_back(to);
 }
 void add2(int from,int to){
     //Edge e;e.go=to;e.next=end2[from];G2.push_back(e);end2[from]=G2.size()-1;
     G2[from].push_back(to);
 }
 void dfs(int u){
     v[u]=;
     ;i<G[u].size();i++){
         //int go=G[i].go;
         int go=G[u][i];
         if(!v[go]) dfs(go);
     }
     S.push_back(u);
 }
 void dfs2(int u){
     book[u]=bcc_count;
     bcc_node[bcc_count]++;
     ;i<G2[u].size();i++){
         //int go=G2[i].go;
         int go=G2[u][i];
         if(!book[go]) dfs2(go);
     }
 }
 int dp(int x){
     if(mem[x]) return mem[x];
     int& ans=mem[x];
     ;i<=bcc_count;i++) if(i!=x&&map[i][x]) ans=max(ans,dp(i)+bcc_node[x]);
     if(!ans) ans=bcc_node[x];
     return ans;
 }
 int main()
 {
     scanf("%d",&T);
     while(T--){
         scanf("%d %d",&n,&m);
         init();
         ;i<=m;i++){
             scanf("%d %d",&a,&b);
             add(a,b);add2(b,a);
             inputedge.push_back((InputEdge){a,b});
         }
         ;i<=n;i++) if(!v[i]) dfs(i);
         ;i>=;i--) if(!book[S[i]]){
             bcc_count++;
             dfs2(S[i]);
         }
         ){
             printf("%d\n",n);
             continue;
         }
         ;i<inputedge.size();i++){
             InputEdge& e=inputedge[i];
             map[book[e.;
         }
         ;
         ;i<=bcc_count;i++)
             ans=max(ans,dp(i));
         printf("%d\n",ans);
     }
     ;
 }

用邻接表存图求BCC会出错....

UVa11324 最大团 The Largest Clique-有向图强连通分量&DP的更多相关文章

  1. UVa11324 The Largest Clique(强连通分量+缩点+记忆化搜索)

    题目给一张有向图G,要在其传递闭包T(G)上删除若干点,使得留下来的所有点具有单连通性,问最多能留下几个点. 其实这道题在T(G)上的连通性等同于在G上的连通性,所以考虑G就行了. 那么问题就简单了, ...

  2. UVA 11324 - The Largest Clique(强连通分量+缩点)

    UVA 11324 - The Largest Clique 题目链接 题意:给定一个有向图,要求找一个集合,使得集合内随意两点(u, v)要么u能到v,要么v能到u,问最大能选几个点 思路:强连通分 ...

  3. UVA 11324 The Largest Clique (强连通分量,dp)

    给出一个有向图,求一个最大的结点集合,任意两个点u,v.u可到达v或v可到达u. 一个强连通分量肯定一起选的.而且只能在一条路径上. 所以先找出所有scc,然后缩点找一条最大权的路径,按拓扑序跑DAG ...

  4. 有向图强连通分量的Tarjan算法

    有向图强连通分量的Tarjan算法 [有向图强连通分量] 在有向图G中,如果两个顶点间至少存在一条路径,称两个顶点强连通(strongly connected).如果有向图G的每两个顶点都强连通,称G ...

  5. 有向图强连通分量 Tarjan算法

    [有向图强连通分量] 在有向图G中,如果两个顶点间至少存在一条路径,称两个顶点强连通(strongly connected).如果有向图G的每两个顶点都强连通,称G是一个强连通图.非强连通图有向图的极 ...

  6. 【转】有向图强连通分量的Tarjan算法

    原文地址:https://www.byvoid.com/blog/scc-tarjan/ [有向图强连通分量] 在有向图G中,如果两个顶点间至少存在一条路径,称两个顶点强连通(strongly con ...

  7. 图的连通性:有向图强连通分量-Tarjan算法

    参考资料:http://blog.csdn.net/lezg_bkbj/article/details/11538359 上面的资料,把强连通讲的很好很清楚,值得学习. 在一个有向图G中,若两顶点间至 ...

  8. 有向图强连通分量的Tarjan算法和Kosaraju算法

    [有向图强连通分量] 在有向图G中,如果两个顶点间至少存在一条路径,称两个顶点强连通(strongly connected).如果有向图G的每两个顶点都强连通,称G是一个强连通图.非强连通图有向图的极 ...

  9. 算法笔记_144:有向图强连通分量的Tarjan算法(Java)

    目录 1 问题描述 2 解决方案 1 问题描述 引用自百度百科: 如果两个顶点可以相互通达,则称两个顶点强连通(strongly connected).如果有向图G的每两个顶点都强连通,称G是一个强连 ...

随机推荐

  1. html中select标签获取选中value和text

    $("#id").find("option:selected").text(); //获取Select选择的Text$("#id").val ...

  2. 242. Valid Anagram

    Given two strings s and t, write a function to determine if t is an anagram of s. For example,s = &q ...

  3. Android权限之sharedUserId和签名

    转自:http://blog.csdn.net/hmg25/article/details/6447067 最近在做个东西,巧合碰到了sharedUserId的问题,所以收集了一些资料,存存档备份. ...

  4. 最小费用最大流 POJ2195-Going Home

    网络流相关知识参考: http://www.cnblogs.com/luweiseu/archive/2012/07/14/2591573.html 出处:優YoU http://blog.csdn. ...

  5. PO_PO系列 - 安全文件管控管理分析(案例)

    2014-07-01 Created By BaoXinjian

  6. Codeforces Round #367 (Div. 2) Hard problem

    Hard problem 题意: 有n个字符串,对第i个字符串进行反转操作代价为ci. 要使n个字符串按照字典序从小到大排列,最小的代价是多少. 题解: 反转就是reverse操作,比如说45873反 ...

  7. 2016 Multi-University Training Contest 5 ATM Mechine

    ATM Mechine 本文转自:http://blog.csdn.net/queuelovestack/article/details/52096337 题意: 这题的意思还是比较费解的 Alice ...

  8. JAVA算数运算符

    算数运算符 序号 算数运算符 含义用法 特殊含义用法 1 + 加法 字符串连接 2 - 减法   3 * 乘法   4 / 除法   5 % 取余   实例: public class Test{ p ...

  9. Web Uploader文件上传&&使用webupload有感(黄色部分)

    引入资源 使用Web Uploader文件上传需要引入三种资源:JS, CSS, SWF. <!--引入CSS--> <link rel="stylesheet" ...

  10. unset是不能清除保存在本地电脑上的cookie的,用于session就可以(弄了半天原来是这样)

    unset($_COOKIE["historyWord[$wordId]"]); 这样是不行的,unset只是将变量在脚本运行时注销,但是cookie是写在客户端的,下一次还是可以 ...