vjudge 上题目链接:uva 11324

  scc + dp,根据大白书上的思路:" 同一个强连通分量中的点要么都选,要么不选。把强连通分量收缩点后得到SCC图,让每个SCC结点的权等于它的结点数,则题目转化为求 SCC 图上权最大的路径。由于 SCC 图是一个 DAG, 可以用动态规划求解。"

  一开始我理解成了求所有结点的权值和,后来才明白所求的结果一定是 scc 上一条路径来的,即不能有任何分叉路径。我的代码如下:

 #include<cstdio>
#include<cstring>
#include<algorithm>
#include<vector>
using namespace std;
const int N = ; vector<int> G[N], G2[N];
bool vis[N];
int sccno[N], scc_cnt, p[N];
vector<int> S; void dfs(int x) {
vis[x] = ;
for(int i = ; i < G[x].size(); ++i)
if(!vis[G[x][i]]) dfs(G[x][i]);
S.push_back(x);
} void dfs2(int x, int &num) {
if(sccno[x]) return ;
sccno[x] = scc_cnt;
++num;
for(int i = ; i < G2[x].size(); ++i)
dfs2(G2[x][i], num);
} void find_scc(int n) {
memset(vis, , sizeof vis);
S.clear();
for(int i = ; i < n; ++i)
if(!vis[i]) dfs(i); memset(sccno, , sizeof sccno);
memset(p, , sizeof p);
scc_cnt = ;
for(int i = n - ; i >= ; --i)
if(!sccno[S[i]]) {
++scc_cnt;
int num = ;
dfs2(S[i], num);
p[scc_cnt] = num;
}
} vector<int> d[N];
void debug(int n) {
for(int i = ; i < n; ++i)
d[i].clear();
for(int i = ; i < n; ++i)
d[sccno[i]].push_back(i); for(int u = ; u <= scc_cnt; ++u) {
printf("sccno[%d]: ",u);
for(int i = ; i < d[u].size(); ++i)
printf("%d ",d[u][i] + );
printf(" num = %d p[%d] = %d\n", d[u].size(), u, p[u]);
}
} vector<int> g3[N];
int node(int x) {
if(vis[x]) return p[x];
vis[x] = ;
int Max = ;
for(int i = ; i < g3[x].size(); ++i)
Max = max(Max, node(g3[x][i]));
return p[x] += Max;
} void new_graph(int n) {
for(int i = ; i <= n; ++i)
g3[i].clear();
for(int u = ; u < n; ++u)
for(int i = ; i < G[u].size(); ++i) {
int v = G[u][i];
if(sccno[u] != sccno[v]) g3[sccno[u]].push_back(sccno[v]);
}
memset(vis, , sizeof vis);
int ans = ;
for(int i = ; i <= scc_cnt; ++i)
ans = max(ans, node(i));
printf("%d\n",ans);
} int main() {
int t,n,m,x,y;
scanf("%d",&t);
while(t--) {
scanf("%d %d",&n,&m);
for(int i = ; i < n; ++i) {
G[i].clear();
G2[i].clear();
}
while(m--) {
scanf("%d %d",&x,&y);
--x; --y;
G[x].push_back(y);
G2[y].push_back(x);
}
find_scc(n);
// debug(n);
new_graph(n);
}
return ;
}

uva 11324 The Largest Clique的更多相关文章

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

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

  2. uva 11324 The Largest Clique(图论-tarjan,动态规划)

    Problem B: The Largest Clique Given a directed graph G, consider the following transformation. First ...

  3. uva 11324 The Largest Clique(强连通分量缩点+DAG动态规划)

    http://uva.onlinejudge.org/index.php?option=com_onlinejudge&Itemid=8&category=25&page=sh ...

  4. uva 11324 The Largest Clique (Tarjan+记忆化)

    /*每个环 要么不选 要么全选 可缩点 就得到一个GAD图 然后搞搞算出最大路径*/ #include<iostream> #include<cstdio> #include& ...

  5. UVA - 11324 The Largest Clique 强连通缩点+记忆化dp

    题目要求一个最大的弱联通图. 首先对于原图进行强连通缩点,得到新图,这个新图呈链状,类似树结构. 对新图进行记忆化dp,求一条权值最长的链,每一个点的权值就是当前强连通分量点的个数. /* Tarja ...

  6. UVA 11324 The Largest Clique(强连通分量+缩点DAG的DP)

    题意:给定一个有向图,求出一个最大的结点集,这个节点集中的随意两个点之间至少一个能到达还有一个点. 思路:假设一个点在这个节点集中,那么它所在的强连通分量中的点一定所有在这个节点集中,反之亦然, 求出 ...

  7. UVA 11324.The Largest Clique tarjan缩点+拓扑dp

    题目链接:https://vjudge.net/problem/UVA-11324 题意:求一个有向图中结点数最大的结点集,使得该结点集中任意两个结点u和v满足:要目u可以到达v,要么v可以到达u(相 ...

  8. UVa 11324 The Largest Clique (强连通分量+DP)

    题意:给定一个有向图,求一个最大的结点集,使得任意两个结点,要么 u 能到 v,要么 v 到u. 析:首先,如果是同一个连通分量,那么要么全选,要么全不选,然后我们就可以先把强连通分量先求出来,然后缩 ...

  9. UVA - 11324 The Largest Clique (强连通缩点+dp)

    题目链接 题意:从有向图G中找到一个最大的点集,使得该点集中任意两个结点u,v满足u可达v或v可达u. 解法:先把同处于一个强连通分量中的结点合并(缩点),得到一张DAG图,在DAG上dp即可. 感觉 ...

随机推荐

  1. SlickGrid example 4: 过滤

    <!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/ ...

  2. MultiSelectComboBox(二)

    1. MainWindow.xaml <Window x:Class="MultiSelectDemo.MainWindow"         xmlns="htt ...

  3. hdu4932 Miaomiao's Geometry

    这是一道搜索题,我们很容易得到目标值的上下界,然后就只能枚举了. 就是将x轴上的点排序之后从左到右依次考察每个点,每个点要么在线段的左端点,要么在线段的右端点. 点编号从0到n-1,从编号为1的点开始 ...

  4. 测试-Unity修改权重

    以下内容仅为猜想,只进行了初步验证 FBX骨骼中包含所绑定的顶点索引,导入Unity后,Unity会把层级树保存起来,然后实例化的时候映射过去 编辑器下权重信息本身不在fbx文件的meta里,不可修改 ...

  5. Socket状态变迁图

    在一些防火墙或端口管理工具中经常会看到连接状态为CLOSED CLOSE_WITE LAST_ACK等的进程, 虽然状态就那么很少的几个, 而且看字面意思也能猜个大概, 但没做过Socket编程的朋友 ...

  6. Python科学计算环境推荐——Anaconda

    最近在用Python做中文自然语言处理.使用的IDE是PyCharm.PyCharm确实是Python开发之首选,但用于科学计算方面,还略有欠缺.为此我尝试过Enthought Canopy,但Can ...

  7. response.sendRedirect()重新定向的乱码问题

    这里response.sendRedirect("YPbianhaoModify.jsp?jinhuoshang="+jinhuoshang+"&jinhuori ...

  8. HTML框架与布局

    原文:http://www.cnblogs.com/yyhh/p/4210659.html HTML块 HTML块元素 块元素在显示时,通常会以新行开始 如:<h1>.<p>. ...

  9. 主框架搭建demo

    - (void)viewDidLoad {     [super viewDidLoad];        [self setUpAllChildViewController]; }    /**   ...

  10. Writing Text File From A Tabular Block In Oracle Forms

    The example given below for writing text file or CSV using Text_IO package from a tabular block in O ...