targan解析
【算法讲解】
先咕了(
【例题】
【例1】牛的舞会
模板题,求强连通分量个数。
code:
#include<bits/stdc++.h>
using namespace std;
int n,m,ans;
int head[25000],cnt;
int dfn[25000],low[25000],tot,vis[25000],vis1[25000],stk[25000],top;
struct edge{
int v,next;
}e[55000];
void add(int u,int v){
e[++cnt].v=v;
e[cnt].next=head[u];
head[u]=cnt;
}
void dfs(int u){
dfn[u]=low[u]=++tot;
vis[u]=vis1[u]=1;stk[++top]=u;
for(int i=head[u];i;i=e[i].next){
int v=e[i].v;
if(!dfn[v])dfs(v),low[u]=min(low[u],low[v]);
else if(vis[v])low[u]=min(low[u],low[v]);
}
if(dfn[u]==low[u]){
int sum=0;
while(stk[top]!=u)vis[stk[top]]=0,--top,++sum;
--top;++sum;
if(sum>1)++ans;
}
}
int main(){
scanf("%d%d",&n,&m);
for(int i=1;i<=m;++i){
int u,v;
scanf("%d%d",&u,&v);
add(u,v);
}
for(int i=1;i<=n;++i)
if(vis1[i]==0)dfs(i);
printf("%d\n",ans);
return 0;
}
【例2】受欢迎的牛G
缩点,把所有强连通分量都缩成一个点,使其成为一张有向无环图,则最受欢迎的点即为出度为 \(0\) 的点。
当然,不是真的让你把几个点缩成一个点,只要你判断一下是不是出度为 \(0\) 。另外,还得考虑一下该图是否联通。具体见代码。
code:
using namespace std;
int n,m,ans;
int head[25000],cnt;
int dfn[25000],low[25000],tot,vis[25000],vis1[25000],stk[25000],top;
int node[25000],cot;
int out[25000],sum[25000],num;
int d[25000];
struct edge{
int v,next;
}e[55000];
void add(int u,int v){
e[++cnt].v=v;
e[cnt].next=head[u];
head[u]=cnt;
}
int find(){
int pot=0;
for(int i=1;i<=cot;++i)
for(int j=head[node[i]];j;j=e[j].next)
if(d[e[j].v]==0)++pot;//求出度
return pot;
}
void dfs(int u){
dfn[u]=low[u]=++tot;
vis[u]=1;stk[++top]=u;
for(int i=head[u];i;i=e[i].next){
int v=e[i].v;
if(dfn[v]==0)dfs(v),low[u]=min(low[u],low[v]);
else if(vis[v])low[u]=min(low[u],dfn[v]);
}//以上为tarjan正常操作
if(dfn[u]==low[u]){
++num;
int t;
do{
t=stk[top--];
node[++cot]=t;//缩点。储存是为了方便求出度。
vis[t]=0;
++sum[num];//强连通图的点的个数
d[t]=1;//标记是否在强连通图上
}
while(t!=u);
out[num]=find();
cot=0;
memset(d,0,sizeof(d));
}
}
int main(){
scanf("%d%d",&n,&m);
for(int i=1;i<=m;++i){
int u,v;
scanf("%d%d",&u,&v);
add(u,v);
}
for(int i=1;i<=n;++i)
if(dfn[i]==0)dfs(i);
int c=0;
for(int i=1;i<=num;++i)
if(out[i]==0)++c,ans=sum[i];
if(c==1)printf("%d\n",ans);
else printf("0\n");//别忘了判断联通!
return 0;
}
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】凌霞软件回馈社区,博客园 & 1Panel & Halo 联合会员上线
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】博客园社区专享云产品让利特惠,阿里云新客6.5折上折
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· PostgreSQL 和 SQL Server 在统计信息维护中的关键差异
· C++代码改造为UTF-8编码问题的总结
· DeepSeek 解答了困扰我五年的技术问题
· 为什么说在企业级应用开发中,后端往往是效率杀手?
· 用 C# 插值字符串处理器写一个 sscanf
· 为DeepSeek添加本地知识库
· 精选4款基于.NET开源、功能强大的通讯调试工具
· DeepSeek智能编程
· [翻译] 为什么 Tracebit 用 C# 开发
· 腾讯ima接入deepseek-r1,借用别人脑子用用成真了~