LRJ白书图论 11324 - The Largest Clique uva
/*题意:给一张有向图,求这样的一个点集,使得集合中的点u,v,u->v,or v->u,or,u<->v。对图缩点,构造一张DAG。在DAG上作dp最长路。点权为每个强连通分量重节点的个数。
*/
#include <stdio.h>
#include <cstring>
#include <algorithm>
#include <vector>
using namespace std;
const int maxn=1010;
const int maxm=50001;
struct edge
{int to,next;
} e[maxm];
vector<int> map[maxn];
int head[maxn],low[maxn],stack[maxn],dfn[maxn],belong[maxn],dp[maxn],num[maxn];
bool vis[maxn];
int n,t,scnt,top,cnt;
void add(int i,int j)
{e[t].next=head[i];e[t].to=j;head[i]=t++;
}
void tarjan(int u)
{int tt;dfn[u]=low[u]=++cnt;stack[top++]=u;vis[u]=true;for(int i=head[u]; i!=-1; i=e[i].next){int j=e[i].to;if(!dfn[j]){tarjan(j);low[u]=min(low[u],low[j]);}else if(vis[j])low[u]=min(low[u],low[j]);}if(low[u]==dfn[u]){scnt++;do{tt=stack[--top];belong[tt]=scnt;vis[tt]=false;}while(u!=tt);}
}
int f(int u)
{if(dp[u]) return dp[u];int ans=0;for(int i=0; i<(int)map[u].size(); i++)ans=max(ans,f(map[u][i]));return dp[u]=ans+num[u];
}
int main()
{int T,m,a,b;scanf("%d",&T);while(T--){scanf("%d%d",&n,&m);memset(head,-1,sizeof(head));memset(belong,0,sizeof(belong));memset(low,0,sizeof(low));memset(dfn,0,sizeof(dfn));memset(stack,0,sizeof(stack));memset(vis,false,sizeof(vis));memset(dp,0,sizeof(dp));memset(num,0,sizeof(num));top=0;cnt=scnt=t=0;while(m--){scanf("%d%d",&a,&b);add(a,b);}for(int i=1; i<=n; i++){if(!dfn[i]) tarjan(i);}memset(vis,false,sizeof(vis));for(int i=1; i<=scnt; i++) map[i].clear();for(int i=1; i<=n; i++){for(int j=head[i]; j!=-1; j=e[j].next){int u=e[j].to;if(belong[i]!=belong[u]){map[belong[i]].push_back(belong[u]);vis[belong[u]]=true;//从入度为0点开始搜}}num[belong[i]]++;}int ans=0;for(int i=1; i<=scnt; i++)if(!vis[i]) ans=max(ans,f(i));printf("%d\n",ans);}return 0;
}
LRJ白书图论 11324 - The Largest Clique uva相关推荐
- 倒水问题(Fill,UVA 10603) lrj白书 p202
看着lrj的代码自己敲了一遍,还没调试成功.... 有时间再进行完善 /*状态start到各个状态u1,u2,u3.....的倒水量分别为u1.dist,u2.dist,u3.dist....*//* ...
- UVAoj 11324 - The Largest Clique(tarjan + dp)
题意:给定一个有向图,寻找一个点数最大集合,使得这个集合中的任意两个点 u,v, 都有u->v 或者 v->u 或者u<==>v 思路:首先将强连通分量通过tarjan算法求出 ...
- The Largest Clique UVA - 11324( 强连通分量 + dp最长路)
这题 我刚开始想的是 缩点后 求出入度和出度为0 的点 然后统计个数 用总个数 减去 然而 这样是不可以的 画个图就明白了... 如果 减去度为0的点 那么最后如果出现这样的情况是不可 ...
- 白书P61 - 点集配对问题
白书P61 - 点集配对问题 状压DP #include <iostream> #include <cstdio> #include <cstring> using ...
- 【UVA11324】The Largest Clique (SCC)
题意: 给一张有向图G,求一个结点数最大的结点集,使得该结点中任意两个结点 u 和 v满足:要么 u 可以到达 v, 要么 v 可以到达 u(u 和 v 相互可达也可以). 分析: Tarjan求SC ...
- UVA11324-- The Largest Clique(SCC+DP)
题目链接 题意:给出一张有向图,求一个结点数最大的结点集,使得该结点集中随意两个结点u和v满足:要么u能够到到v,要么v能够到达u(u和v能够互相到达) 思路:我们能够缩点,用Tarjan求出全部强连 ...
- UVA 1324 The Largest Clique 最大团(强连通分量,变形)
题意:给一个有向图,要求找出一些点,使得这些点中的任意点对,要么可以互通,要么单向可达. 思路:最低只要求单向可达即可,即a->b都可以算进去. 强连通分量内的点肯定是满足要求的,可以全选,但是 ...
- 【算法学习笔记】03.白书练习题stat(排序入门:冒泡,桶)
原题: 输入一些学生的分数,哪个分数出现的次数最多?如果有多个并列,从小到大输出. 任务1,分数为不超过100的非负整数.(题眼.) 任务2,分数为不超过100.00的非负实数.保留两位小数(两位的处 ...
- UVA 116 Unidirectional TSP (白书dp)
http://acm.hust.edu.cn:8080/judge/problem/viewProblem.action?id=18206 1 /* 2 题目大意: 3 从第一列的任意一格出发,到子最 ...
最新文章
- PMP-【第1章 引论】-2020-12-29(25页-34页)
- Thinking in java基础之集合框架
- (转)【超详细教程】使用Windows Live Writer 2012和Office Word 2013 发布文章到博客园全面总结...
- RabbitMQ Network Partitions 处理策略
- python列表元素之和_python实现计算列表元素之和
- MySQL InnoDB Memcached Plugin在Oray公司的实践
- 桃李不言,下自成蹊——《大数据》编辑部祝各位老师节日快乐!
- 6款英雄主题fcpx标题字幕插件:Hero Shot Titles for Mac
- DB2时间函数 实现 时间加减
- 知乎发布“战疫”数据报告:“新型肺炎”相关回答获17.3亿次阅读
- mysql 数据库dbhelp_策略模式实现支持多种类数据库的DBHelp
- 厉害了,用python爬取自己的微信朋友
- windows cmd命令行命令
- Java中线程出现Exception in thread Thread-0 java.lang.IllegalMonitorStateException异常 解决方法...
- 爬虫百度图片进入百度验证怎么办?
- 前端js使用jszip实现文件压缩功能
- hibernate查询的方式 都有哪些
- 微信小程序头像怎么改变形状_微信小程序 open-data更改样式 open-data 显示头像 圆形...
- 病毒式营销和网络口碑营销的区别
- windows主机和虚拟机设置桥接