白书上的例题

做一遍tarjan后,缩点,每一个scc节点的权为它的结点数,做一次DAG上的动规,求出路径上的最大点权和,就可以了

 #include<cstdio>
#include<cstring>
#include<iostream>
#include<algorithm>
#include<stack>
#include<vector>
using namespace std; const int maxn = ;
int n,m;
int first[maxn];
int sc[maxn],scn[maxn],low[maxn],pre[maxn];
int scnt,ecnt,dfs_clock;
int dp[maxn]; int first1[maxn];
int ecnt1; struct Edge{
int v,next;
}e[maxn*]; Edge e1[maxn*]; stack<int> S; void init(){
ecnt = ecnt1 = ;
memset(first,-,sizeof(first));
memset(first1,-,sizeof(first1));
memset(dp,,sizeof(dp));
} void addedges(int u,int v){
e[ecnt].v = v;
e[ecnt].next = first[u];
first[u] = ecnt++;
} void addedges1(int u,int v){
e1[ecnt1].v = v;
e1[ecnt1].next = first1[u];
first1[u] = ecnt1++;
} void dfs(int u){
low[u] = pre[u] = ++dfs_clock;
S.push(u);
for(int i = first[u];~i;i = e[i].next){
int v = e[i].v;
if(!pre[v]){
dfs(v);
low[u] = min(low[u],low[v]);
}
else if(!sc[v]) low[u] = min(low[u],pre[v]);
}
if(pre[u] == low[u]){
scnt++;
for(;;){
int x = S.top();S.pop();
sc[x] = scnt;
scn[scnt]++;
if(x == u) break;
}
}
} void find_scc(){
while(!S.empty()) S.pop();
scnt = dfs_clock = ;
memset(low,,sizeof(low));memset(pre,,sizeof(pre));
memset(sc,,sizeof(sc));memset(scn,,sizeof(scn)); for(int i = ;i <= n;i++) if(!pre[i]) dfs(i);
} int solve(int p){
if(dp[p]) return dp[p];
for(int i = first1[p];~i;i = e1[i].next){
int v = e1[i].v;
dp[p] = max(dp[p],solve(v));
}
return dp[p] = dp[p] + scn[p];
} int main(){
int T;
scanf("%d",&T);
while(T--){
init();
scanf("%d %d",&n,&m);
for(int i = ;i < m;i++ ){
int u,v;
scanf("%d %d",&u,&v);
addedges(u,v);
}
find_scc(); for(int u = ;u <= n;u++){
for(int i = first[u];~i;i = e[i].next){
int v = e[i].v;
if(sc[u] != sc[v]) addedges1(sc[u],sc[v]);
}
} int ans = ;
for(int i = ;i <= scnt;i++) ans = max(ans,solve(i));
printf("%d\n",ans);
}
return ;
}

还有另一种做法是,建立一个超级源点,与入度为0的scc节点连接,做一次spfa,求出路径上的最大点权和

 #include<cstdio>
#include<cstring>
#include<iostream>
#include<algorithm>
#include<stack>
#include<vector>
#include<queue>
using namespace std; const int maxn = ;
const int INF = ;
int n,m;
int first[maxn];
int sc[maxn],scn[maxn],low[maxn],pre[maxn];
int scnt,ecnt,dfs_clock;
int dp[maxn]; int du[maxn];
int dis[maxn];
int inq[maxn]; int first1[maxn];
int ecnt1; struct Edge{
int v,next;
}e[maxn*]; Edge e1[maxn*]; stack<int> S;
vector<int> g[maxn];
int val[maxn]; void init(){
ecnt = ecnt1 = ;
memset(first,-,sizeof(first));
memset(val,,sizeof(val));
memset(du,,sizeof(du));
} void addedges(int u,int v){
e[ecnt].v = v;
e[ecnt].next = first[u];
first[u] = ecnt++;
} void dfs(int u){
low[u] = pre[u] = ++dfs_clock;
S.push(u);
for(int i = first[u];~i;i = e[i].next){
int v = e[i].v;
if(!pre[v]){
dfs(v);
low[u] = min(low[u],low[v]);
}
else if(!sc[v]) low[u] = min(low[u],pre[v]);
}
if(pre[u] == low[u]){
scnt++;
for(;;){
int x = S.top();S.pop();
sc[x] = scnt;
val[scnt]++;
if(x == u) break;
}
}
} void find_scc(){
while(!S.empty()) S.pop();
scnt = dfs_clock = ;
memset(low,,sizeof(low));memset(pre,,sizeof(pre));
memset(sc,,sizeof(sc));memset(scn,,sizeof(scn)); for(int i = ;i <= n;i++) if(!pre[i]) dfs(i);
} int spfa(){
memset(inq, , sizeof(inq));
queue<int>q;
g[].clear();
q.push();
dis[] = ; val[] = ;
for(int i = ; i <= scnt; i++){if(du[i] == )g[].push_back(i); dis[i] = -INF;}
int ans = ;
while(!q.empty()){
int u = q.front(); q.pop(); inq[u] = ;
for(int i = ; i < g[u].size(); i++){
int v = g[u][i];
if(dis[v] < dis[u] + val[v]){
dis[v] = dis[u] + val[v];
ans = max(ans, dis[v]);
if(inq[v] == )inq[v] = , q.push(v);
}
}
}
return ans;
} int main(){
int T;
scanf("%d",&T);
while(T--){
init();
scanf("%d %d",&n,&m);
for(int i = ;i < m;i++ ){
int u,v;
scanf("%d %d",&u,&v);
addedges(u,v);
}
find_scc();
for(int i = ;i <= scnt;i++) g[i].clear(); for(int u = ;u <= n;u++){
for(int i = first[u];~i;i = e[i].next){
int v = e[i].v;
if(sc[u] != sc[v]) g[sc[u]].push_back(sc[v]),du[sc[v]]++;
}
}
printf("%d\n",spfa());
}
return ;
}

Uva 11324 The Largest Clique【强连通 DAG动规 spfa】的更多相关文章

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

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

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

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

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

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

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

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

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

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

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

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

  7. uva 11324 The Largest Clique

    vjudge 上题目链接:uva 11324 scc + dp,根据大白书上的思路:" 同一个强连通分量中的点要么都选,要么不选.把强连通分量收缩点后得到SCC图,让每个SCC结点的权等于它 ...

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

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

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

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

随机推荐

  1. RabbitMQ学习之集群模式

    由于RabbitMQ是用erlang开发的,RabbitMQ完全依赖Erlang的Cluster,因为erlang天生就是一门分布式语言,集群非常方便,但其本身并不支持负载均衡.Erlang的集群中各 ...

  2. Nginx的安装与升级

    1,构建Nginx服务器; 2.升级版本; 一, 构建Nginx服务器 1.使用源码包安装nginx软件包 # yum -y install gcc pcre-devel openssl-devel  ...

  3. javase 异常处理

    1.简述什么是异常.异常的继承体系?  异常就是java代码块在运行时出现的错误,有编译错误和运行错误,  Throwable是所有异常的父类它包含了error和Exception两个子类.  其中e ...

  4. httpClient 几种超时问题

    HttpClient的有3种超时时间,分别是: 1. [java] view plaincopyprint? ConnManagerParams.setTimeout(params, 1000); C ...

  5. (0)前言【从零开始学Spring Boot】

    在此对整体技术简单说明下. 开发工具和开发环境: Win7 64位操作 Eclipse-jee-mars-2-win32-x86_64 Jdk 1.8 Maven管理项目 如果要学习Spring Bo ...

  6. js/jquery 判断支持touchstart

      if ('ontouchstart' in document.documentElement) { //... }

  7. PatentTips - Uncore thermal management

    BACKGROUND The field of invention relates to the computer sciences, generally, and, more specificall ...

  8. 数据库-mongodb-高级查询表达式

    不等于  $nq 1 2 SQL : select * where != 3 NOSQL : db.goods.find({cat_id:{$ne:3 }},{cat_id:1,id:0}); NOS ...

  9. Ajax-URL 防止数据缓存,添加时间戳

    url:CONTEXTPATH + "/dataService/getSourceStatics?type=0&t="+new Date().getTime(),

  10. Github博客私人订制(一)

    这是博客订制的第一步,简单博客的建立. (这里不做截图说明了,贴图实在是太累,有问题大家QQ私聊我) (一)创建Github账号 URL:https://github.com/ (二)登录Github ...