题意:给一个有向图,要求找出一些点,使得这些点中的任意点对,要么可以互通,要么单向可达。

思路:最低只要求单向可达即可,即a->b都可以算进去。

  强连通分量内的点肯定是满足要求的,可以全选,但是有多个强连通分量时就不行了,得有取舍。老方法,先缩点,缩完点后是没有环的存在的,所以就是拓扑图了。如果只给一个拓扑图,要求找一条链使得链上的点最多,那么可以用判断拓扑的方式,逐个将入度为0的点删除,且在删除的时候记录下最多有多少个点,删到最后一个点时就出结果了。这样的方法同样适用,只是每个点可能是缩点,而且要将这些缩点内的点数算上去而已。

实现:

  (1)求强连通分量。

  (2)统计缩点的度数并建(缩点)图。

  (3)按判断拓扑图的方式来进行点数的统计。

  1 #include <bits/stdc++.h>
  2 #define LL long long
  3 #define pii pair<int,int>
  4 using namespace std;
  5 const int N=1000+5;
  6 const int INF=0x7f7f7f7f;
  7 vector<int> vect[N], g[N];  //原图,缩点后的图
  8 int n, m;
  9 int dfn[N], lowlink[N], scc_no[N], dfn_clock, scc_cnt; //强连通分量必备
 10 stack<int> stac;    //强联通分量用栈
 11 unordered_map<int,int> chu[N],ru[N];    //仅仅为了防止重复统计
 12 int  r[N]; //出入度
 13 int num[N];     //强联通分量中的点数
 14 int dp[N];      //答案
 15
 16 void DFS(int x)
 17 {
 18     stac.push(x);
 19     dfn[x]=lowlink[x]=++dfn_clock;
 20     for(int i=0; i<vect[x].size(); i++)
 21     {
 22         int t=vect[x][i];
 23         if(!dfn[t])
 24         {
 25             DFS(t);
 26             lowlink[x]=min(lowlink[x],lowlink[t]);
 27         }
 28         else if(!scc_no[t])    lowlink[x]=min(lowlink[x], dfn[t]);
 29     }
 30     if(lowlink[x]==dfn[x])
 31     {
 32         ++scc_cnt;
 33         while(true)
 34         {
 35             int t=stac.top();stac.pop();
 36             scc_no[t]=scc_cnt;
 37             if(t==x)    break;
 38         }
 39     }
 40 }
 41
 42
 43 int cal()
 44 {
 45     memset(dfn,0,sizeof(dfn));
 46     memset(lowlink,0,sizeof(lowlink));
 47     memset(scc_no,0,sizeof(scc_no));
 48     dfn_clock=scc_cnt=0;
 49     for(int i=1; i<=n; i++) if(!dfn[i]) DFS(i);
 50
 51     if(scc_cnt==1)  return n;
 52     for(int i=1; i<=scc_cnt; i++)   g[i].clear(),chu[i].clear(),ru[i].clear();
 53     for(int i=1; i<=n; i++) //统计度,建图
 54     {
 55         for(int j=0; j<vect[i].size(); j++)
 56         {
 57             int t=vect[i][j];
 58             if(scc_no[i]!=scc_no[t])
 59             {
 60                 if(!chu[scc_no[i]][scc_no[t]])   //还没出现过
 61                 {
 62                     chu[scc_no[i]][scc_no[t]]=1;
 63                     g[scc_no[i]].push_back(scc_no[t]);
 64                 }
 65                 ru[scc_no[t]][scc_no[i]]=1;
 66             }
 67         }
 68     }
 69     deque<int> que;
 70     memset(r,0,sizeof(r));
 71     for(int i=1; i<=scc_cnt; i++)   //统计出入度
 72     {
 73         r[i]=ru[i].size();
 74         if(!r[i])   que.push_back(i);
 75     }
 76
 77     memset(num,0,sizeof(num));
 78     for(int i=1; i<=n; i++)    num[scc_no[i]]++;    //统计点数
 79
 80     memset(dp,0,sizeof(dp));    //按拓扑序来dp
 81     int ans=0;
 82     while(!que.empty())
 83     {
 84         int siz=que.size();
 85         for(int i=0; i<siz; i++)    //所有入度为0的节点
 86         {
 87             int t=que.front();que.pop_front();
 88             ans=max(ans,dp[t]+num[t]);
 89             for(int j=0; j<g[t].size(); j++)    //每条以t出发的边
 90             {
 91                 int d=g[t][j];
 92                 r[d]--;
 93                 if(!r[d])  que.push_back(d);
 94                 dp[d]=max(dp[d],dp[t]+num[t]);
 95             }
 96         }
 97     }
 98     return ans;
 99 }
100
101
102 int main()
103 {
104     //freopen("input.txt", "r", stdin);
105
106     int t, a, b;
107     cin>>t;
108     while(t--)
109     {
110         scanf("%d%d", &n, &m);
111         for(int i=1; i<=n; i++) vect[i].clear();
112         for(int i=0; i<m; i++)
113         {
114             scanf("%d%d",&a,&b);
115             vect[a].push_back(b);
116         }
117         cout<<cal()<<endl;
118     }
119     return 0;
120 }

AC代码

转载于:https://www.cnblogs.com/xcw0754/p/4630692.html

UVA 1324 The Largest Clique 最大团(强连通分量,变形)相关推荐

  1. The Largest Clique UVA - 11324( 强连通分量 + dp最长路)

    这题  我刚开始想的是  缩点后  求出入度和出度为0 的点  然后统计个数  用总个数 减去 然而 这样是不可以的  画个图就明白了... 如果  减去度为0的点  那么最后如果出现这样的情况是不可 ...

  2. LRJ白书图论 11324 - The Largest Clique uva

    /*题意:给一张有向图,求这样的一个点集,使得集合中的点u,v,u->v,or v->u,or,u<->v.对图缩点,构造一张DAG.在DAG上作dp最长路.点权为每个强连通分 ...

  3. UVA11324-- The Largest Clique(SCC+DP)

    题目链接 题意:给出一张有向图,求一个结点数最大的结点集,使得该结点集中随意两个结点u和v满足:要么u能够到到v,要么v能够到达u(u和v能够互相到达) 思路:我们能够缩点,用Tarjan求出全部强连 ...

  4. UVAoj 11324 - The Largest Clique(tarjan + dp)

    题意:给定一个有向图,寻找一个点数最大集合,使得这个集合中的任意两个点 u,v, 都有u->v 或者 v->u 或者u<==>v 思路:首先将强连通分量通过tarjan算法求出 ...

  5. Uva 247 - Calling Circles(传递闭包 / 强连通分量)

    题目链接 https://vjudge.net/problem/UVA-247 [题意] 如果两个人直接或间接互相打电话,则说明他们在同一个电话圈里.例如a打给b,b打给c,c打给d,d打给a,则这4 ...

  6. UVA 11504 Dominos 强连通分量

    找出强连通分量,缩点后统计入度为0的结点数. //#pragma comment(linker, "/STACK:1024000000,1024000000") #include& ...

  7. 【C++】强连通分量

    强连通分量 先来一题例题 题目大意 怎么做? 分析 结论 不要高兴得太早 怎么办呢? 定义 缩点法 原图构建新图 发现 新的结论 强连通分量算法 Kosaraju算法 Tarjan算法 例题:信息传递 ...

  8. 强连通分量(学习心得)

    定义:有向图强连通分量:在有向图G中,如果两个顶点vi,vj间(vi>vj)有一条从vi到vj的有向路径,同时还有一条从vj到vi的有向路径,则称两个顶点强连通如果有向图G的每两个顶点都强连通, ...

  9. 缩点(有向图的强连通分量)学习笔记

    缩点(有向图的强连通分量)学习笔记 1.什么是强连通分量?: 有向图强连通分量:在有向图G中,如果两个顶点vi,vj间(vi>vj)有一条从vi到vj的有向路径,同时还有一条从vj到vi的有向路 ...

最新文章

  1. 设计模式之简单工厂模式(静态工厂方法)
  2. servlet向ajax传递list数据类型,ajax向servlet传递array数据类型
  3. 马斯克的“大脑改造计划”,还需要点亮哪些技能树?
  4. 怎么计算python程序执行时间_【华为云技术分享】计算python程序执行时间
  5. 报名 | AlphaGo Zero是如何实现无师自通的?
  6. c语言成绩等级switch语句,请高手 帮忙做一道c语言题 编程,把百分制成绩转换成5级记分制,要求用switch语句。 90分以上(包括90):...
  7. 1.9 编程基础之顺序查找 08 白细胞计数 python
  8. python基础语法中处理一组数据所使用的类型有哪些_python基本数据预处理语法函数(2)...
  9. 梦的解析 —— 梦知道答案
  10. matlab2c使用c++实现matlab函数系列教程-randint函数
  11. PyTorch中文版官方教程来了,附pdf下载
  12. (转)Aladdin PK SimCorp Dimension
  13. python如何解析xml请求 http_怎么用python处理xml请求和xml响应,wsdl, soap,希望有源码参考。...
  14. Java实现DFA算法敏感词过滤
  15. 一文搞懂深度学习所有工具——Anaconda、CUDA、cuDNN
  16. 蒙古文输入法linux版,蒙古文输入法下载 德力海蒙古文输入法 V2.1.3 官方安装版(附使用手册) 下载-脚本之家...
  17. unity shader projector使用
  18. threejs 效果合成器(EffectComposer)
  19. 山东职业学院计算机专业,山东职业学院最好的专业是什么(10大热门专业排名)...
  20. Mybatis - <choose> 标签的用法

热门文章

  1. poj1860(spfa判正环)
  2. *** cannot be resolved or is not a field
  3. WebService中运用自定义类的处理要领(转)
  4. 路由器NAT负载均衡实验过程详解
  5. ffmpeg h264 解码 转
  6. VirtualBox 删掉虚拟镜像重新安装失败
  7. 蓝桥杯 ALGO-68 算法训练 判定数字
  8. 【计算机组成原理】定点乘法运算之原码两位乘法
  9. python运维脚本部署jdk_Jenkins 为Jenkins添加Windows Slave远程执行python项目脚本
  10. java中使用MD5进行加密