uva 11324
2013-12-14 20:02
274 查看
这是有向图的最大团问题 , 解决方法是:先求出scc的dag图,
再用dag动态规划来求最大团
#include
#include
#include
#include
#include
#include
using namespace std;
const int MAXN = 1100 ;
int pre[MAXN] , lowlink[MAXN] , sccno[MAXN] ;
int n = 0, m = 0, dfs_clock = 0, scc_cnt = 0 , vis[MAXN];
vector grap[MAXN] ;
stack s;
int d[MAXN] , scc_sum[MAXN];
int DAG[MAXN][MAXN];
void dfs(int u)
{
lowlink[u] =
pre[u] = ++dfs_clock ;
s.push(u);
for(int i =
0 ; i < grap[u].size() ; i++)
{
int v =
grap[u][i] ;
if(!pre[v])
{
dfs(v)
;
lowlink[u] = min( lowlink[v] , lowlink[u]
);
}
else
if(!sccno[v])
{
lowlink[u] = min(lowlink[u] , pre[v]) ;
//在这里不是和lowlink[v]比较 ,是因为此时lowlink[v] == pre[v] 。
//
因为v这个点首先不属于其他任何一个强连通分量 , 所以就可以判断出v和u是的祖先 。 就是说dfs是先到达v , 然后再从v来到了u
。
}
}
if(lowlink[u] == pre[u])
{
scc_cnt++;
for(;
;)
{
int x =
s.top();
s.pop()
;
sccno[x] =
scc_cnt;
// sum +=
1;
if(x ==
u) break;
}
//
scc_sum[scc_cnt] = sum ;
}
}
void find_scc()
{
memset(pre ,
0 , sizeof(pre));
memset(lowlink , 0 , sizeof(lowlink));
memset(sccno
, 0 , sizeof(sccno));
memset(scc_sum , 0 , sizeof(scc_sum));
memset(vis ,
0 , sizeof(vis));
dfs_clock =
scc_cnt = 0 ;
for(int i =
1; i <= n; i++)
if(!pre[i]) dfs(i);
}
int dp(int v)
{
if(d[v]) return d[v];
int Max = 0;
for(int i = 1;i <= scc_cnt;i++)
if(DAG[v][i])
再用dag动态规划来求最大团
#include
#include
#include
#include
#include
#include
using namespace std;
const int MAXN = 1100 ;
int pre[MAXN] , lowlink[MAXN] , sccno[MAXN] ;
int n = 0, m = 0, dfs_clock = 0, scc_cnt = 0 , vis[MAXN];
vector grap[MAXN] ;
stack s;
int d[MAXN] , scc_sum[MAXN];
int DAG[MAXN][MAXN];
void dfs(int u)
{
lowlink[u] =
pre[u] = ++dfs_clock ;
s.push(u);
for(int i =
0 ; i < grap[u].size() ; i++)
{
int v =
grap[u][i] ;
if(!pre[v])
{
dfs(v)
;
lowlink[u] = min( lowlink[v] , lowlink[u]
);
}
else
if(!sccno[v])
{
lowlink[u] = min(lowlink[u] , pre[v]) ;
//在这里不是和lowlink[v]比较 ,是因为此时lowlink[v] == pre[v] 。
//
因为v这个点首先不属于其他任何一个强连通分量 , 所以就可以判断出v和u是的祖先 。 就是说dfs是先到达v , 然后再从v来到了u
。
}
}
if(lowlink[u] == pre[u])
{
scc_cnt++;
for(;
;)
{
int x =
s.top();
s.pop()
;
sccno[x] =
scc_cnt;
// sum +=
1;
if(x ==
u) break;
}
//
scc_sum[scc_cnt] = sum ;
}
}
void find_scc()
{
memset(pre ,
0 , sizeof(pre));
memset(lowlink , 0 , sizeof(lowlink));
memset(sccno
, 0 , sizeof(sccno));
memset(scc_sum , 0 , sizeof(scc_sum));
memset(vis ,
0 , sizeof(vis));
dfs_clock =
scc_cnt = 0 ;
for(int i =
1; i <= n; i++)
if(!pre[i]) dfs(i);
}
int dp(int v)
{
if(d[v]) return d[v];
int Max = 0;
for(int i = 1;i <= scc_cnt;i++)
if(DAG[v][i])
相关文章推荐
- LA 5135 Mining Your Own Business
- http://kb.cnblogs.com/page/130970/ -http协议
- poj 2942 LA3523 点-双…
- uva 10047
- STL中优先队列的用法
- 并查集及其路径的压缩
- 求欧拉回路的路径 dfs的一种新运用
- poj 2676
- poj 2531
- poj 2251
- poj 2488
- 网络流 SAP优化算法 (…
- 网络流之Dinic算法
- 基于增广路的网络流算法
- poj 1789 最小生成树
- poj 1469
- poj 3041二分匹配
- scanf和cin的区别 (效率的差距)
- 匈牙利算法
- poj 1062 最短路