传送门从入门到入土
[Jsoi2010]连通数:有向图求每一个点到能到达的点的个数的和(包括自己到自己)
SCC+bitset+dp
#包括ebit/stdc .h
使用命名空间标准;
//方法:SCC位集传递闭包或直接位集合优化弗洛伊德
/**
* 1.强连通分量板子复习
* 2.强连通分量缩点重建图复习
* 3.利用位集合求传递闭包(更快,因为可以直接按位或)
* 4.位集合优化弗洛伊德
*/
vectornt h[2010];//原图的邻接表
//tarjan需要的变量
stackint stk
int dfn[2010],low[2010],instk[2010],idx
int SCC[2010],cnt//每一个点所在的单路调节器(单通道控制器)编号、SCC的个数
int SIZE[2010];//每一个单路调节器(单通道控制器)中包含的点数
向量scc[2010年];//新图的邻接表
bit set 2010g[2010];//用于求新图的传递闭包的位集合对于每一个点开一个位集,传递闭包直接或
void tar Jan(int u){ 0
dfn[u]=低[u]=idx;
instk[u]=1;
STK。push(u);
适用于(自动j : h[u]){
if(!dfn[j]){
塔尔扬(j);
low[u]=min(low[u],low[j]);
}else if(instk[j] dfn[j] low[u])
低[u]=dfn[j];
}
如果(低[u]==dfn[u])
碳纳米管;
int num=0;
做{
数量;
int t=STK。top();
SCC[t]=CNT;
instk[t]=0;
STK。pop();
if(t==u)break;
} while(1);
尺寸=数量;//当前单路调节器(单通道控制器)中包含的点数
}
}
bitset 2010 DFS(int u){ 0
if(g[u]!=0)返回g[u];
g[u][u]=1;
适用于(auto v : scc[u]){
g[u]|=DFS(v);
}
返回g[u];
}
void solve(){ 0
int n;
CIN;
//建立原图的邻接表
for(int I=0;I n;I){ 0
for(int j=0;j n;j ){
char c;
CIN c;
if(c=='1') h[i].push _ back(j);
}
}
//SCC
for(int I=0;I n;(一)
if(dfn[I]==0)tar Jan(I);
//重建图,需要遍历所有边
for(int I=0;I n;I){ 0
for(int j=0;j . h . I .size();j ){
if(SCC[i]!=SCC[h[i][j]]) scc[SCC[i]].push _ back(SCC[h[I][j]]);
}
}
int ans=0;
for(int I=1;i=cnti ){ //SCC是从一开始编号的
auto k=DFS(I);//求从我出发能到达的点的位集合
for(int j=1;j=cntj ) //遍历位集合
if(k[j])
ans=SIZE[I]* SIZE[j];
}
标准输出和恩德尔
}
签名main(){ 0
solve();
}
bitset+floyd
#包括ebit/stdc .h
使用命名空间标准;
bit set 2010g[2010];
void solve(){ 0
int n;
CIN;
for(int I=0;I n;I){ 0
字符串s;
宫颈癌前病变的;
反转(s.begin()、s . end());
g[I]=bit set 2010(s);
g[I][I]=1;
}
for(int k=0;k n;k)
for(int I=0;I n;(一)
if(g[I][k])g[I]|=g[k];
int ans=0;
for(int I=0;I n;I){ 0
ans=g[i].count();
}
标准输出和恩德尔
}
签名main(){ 0
solve();
}
内容来源网络,如有侵权,联系删除,本文地址:https://www.230890.com/zhan/124350.html