HIHO #1185 : 连通性·三

2024-08-30 20:08
文章标签 连通性 hiho 1185

本文主要是介绍HIHO #1185 : 连通性·三,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

题目链接

先使用tarjan算法,计算强连通分量,进行缩点成DAG,然后在使用拓扑排序计算

tarjan中,我们只需要从1号节点计算,因为开始时在1号点。
建立新图的过程中,1号点不能到达的点也不用建立到新图里面

#include<bits/stdc++.h>
using namespace std;
#define cl(a,b) memset(a,b,sizeof(a))
#define LL long long
#define pb push_back
#define gcd __gcd#define For(i,j,k) for(int i=(j);i<k;i++)
#define lowbit(i) (i&(-i))
#define _(x) printf("%d\n",x)const int maxn = 2e5+2000;
const int inf  = 1 << 28;int n,m;vector<int> G[maxn];
int w[maxn],w1[maxn];int counter,top;
int stk[maxn],ins[maxn],dfn[maxn],low[maxn];int belong[maxn],cnt;void dfs(int u){low[u]=dfn[u]= ++counter;stk[top++] = u;ins[u] = true;for(int i=0;i<G[u].size();i++){int v = G[u][i];if(!dfn[v]){dfs(v);low[u]=min(low[u],low[v]);}else if(ins[v]){low[u]=min(low[u],dfn[v]);}}if(low[u]==dfn[u]){++cnt;do{int x = stk[--top];ins[x] = false;belong[x] = cnt;w1[cnt]+=w[x];}while(stk[top]!=u);}
}vector<int> G2[maxn];
int deg[maxn];void init(int n){counter=top=cnt=0;for(int i=0;i<=n;i++){w[i]=w1[i]=dfn[i]=low[i]=ins[i]=0;G2[i].clear();G[i].clear();deg[i]=0;}
}int dp[maxn],ans;
void t_sort(){stack<int> s;cl(dp,0);s.push(belong[1]);//开始在原图1位置dp[belong[1]]=w1[belong[1]];while(!s.empty()){int u = s.top();s.pop();for(int i=0;i<G2[u].size();i++){int v = G2[u][i];dp[v] =  max(dp[v],dp[u]+w1[v]);if(--deg[v]==0){s.push(v);}}}
}int main(){cin>>n>>m;init(n);for(int i=1;i<=n;i++)cin>>w[i];for(int i=0;i<m;i++){int x,y;cin>>x>>y;G[x].pb(y);}dfs(1);//缩点,连通分量的编号从1到cnt的闭区间for(int u=1;u<=n;u++){for(int i=0;i<G[u].size();i++){int v = G[u][i];int x = belong[u];int y = belong[v];if(x==y||x==0||y==0)continue;//自环和不能到达的边不要G2[x].pb(y);//printf("%d --> %d\n",x,y);deg[y]++;}}//printf("cnt = %d\n",cnt);
//for(int i=1;i<=n;i++){
//    printf("i = %d, bi = %d\n",i,belong[i]);
//}t_sort();for(int i=1;i<=cnt;i++){if(dp[i]>ans)ans=dp[i];}cout<<ans<<endl;return 0;
}

这篇关于HIHO #1185 : 连通性·三的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/1121803

相关文章

nc -s网络连通性测试

例如: nc -s 192.168.82.67 192.168.82.66 22 在这个命令中,您使用了nc(Netcat)工具来进行网络连接。下面是命令的详细说明: nc: 表示使用Netcat工具进行操作。-s 192.168.82.67: 指定源IP地址为192.168.82.67。这个参数让Netcat使用指定的IP地址进行网络连接,而不是默认的地址。192.168.82.66:

HIHO #1190 : 连通性·四(点的双联通分量)

题目链接 点的双联通分量,不注意写出了一个bug,找了2个多小时= =,我的边存的是0开始的,然后ans数组一开始也是0,然后就是if的地方。。。。。 还是tarjan的算法,结合提示,这里需要存边,然后栈里面保存的是边,而不是点,这里我用边在边集es中的编号,作为边的标志 #include<bits/stdc++.h>using namespace std;#define cl(a,b

HIHO #1184 : 连通性二·边的双连通分量

题目链接 Tarjan算法,介绍可以看题目讲解,很好很清楚 无向图边的双联通分量的定义:对于一个无向图的子图,当删除其中任意一条边后,不改变图内点的连通性,这样的子图叫做边的双连通子图。而当子图的边数达到最大时,叫做边的双连通分量。 或者说,对于一个连通图,如果任意两点至少存在两条”边不重复”的路径。也就是要去每条边至少在一个简单的环中,也就是说所有的边都不是桥 同样是2个方法: 1)题

HIHO #1183 : 连通性一·割边与割点

题目链接 使用Tarjan算法计算无向图的割点和桥,提示讲解的也很清晰 需要注意的是,某一个割点可能会被多次计算,所以一般是先记录然后最后统一输出 1)按照题目的伪代码直接实现 2)稍微优化一下的,省一些空间 #include<bits/stdc++.h>using namespace std;#define cl(a,b) memset(a,b,sizeof(a))#define

HIHO #1182 : 欧拉路·三(有向图 输出欧拉路径)

题目链接 A)建图是巧妙,使用边表示每一个数字,那么就是走完每一个边一次再回到起点,便是求欧拉回路 B)建图是有向图,建图需要注意,同时,输出的时候逆序输出 C)path保存的是完整的路径,输出的时候只需&1即可 #include<bits/stdc++.h>using namespace std;#define cl(a,b) memset(a,b,sizeof(a))#defin

HIHO #1181 : 欧拉路·二(fleury算法输出欧拉路径)

题目链接 伪代码 DFS(u):While (u存在未被删除的边e(u,v))删除边e(u,v)DFS(v)EndPathSize ← PathSize + 1Path[ PathSize ] ← u 点之间可能存在多条边,所以存边,然后标记每条边的标号,还是一个常见的存边的表示法 #include<bits/stdc++.h>using namespace std;#define c

hiho一下 第四十九周 欧拉路·一

【题目链接】:click here~~ 时间限制: 10000ms 单点时限: 1000ms 内存限制: 256MB 描述 小Hi和小Ho最近在玩一个解密类的游戏,他们需要控制角色在一片原始丛林里面探险,收集道具,并找到最后的宝藏。现在他们控制的角色来到了一个很大的湖边。湖上有N个小岛(编号1..N),以及连接小岛的M座木桥。每座木桥上各有一个宝箱,里面似乎装着什么

hiho 1000: A+B

时间限制: 1000ms 单点时限: 1000ms 内存限制: 256MB 描述 求两个整数A+B的和 输入 输入包含多组数据。 每组数据包含两个整数A(1 ≤ A ≤ 100)和B(1 ≤ A ≤ 100)。 输出 对于每组数据输出A+B的和。 样例输入 1 23 4 样例输出 37 代码(C语言): #include <stdio.h>in

运维的利器–监控–zabbix–第三步:配置zabbix–网络–原理:通过ping实现网络连通性监控

文章目录 通过ping实现网络连通性监控1、参数说明2、建立监控项3、创建图形 通过ping实现网络连通性监控 1、参数说明 ICMPPING[,,,,]通过ICMP ping检查主机是否可以访问。 target-目标IP或者域名 packets-数据包数量 interval-间隔时间(毫秒) size-数据包大小(字节) timeout超出时间(毫秒) ICMPPINGLO

hiho一下第56周 高斯消元

小Ho:<吧唧><吧唧><吧唧> 小Hi:小Ho,你还吃呢。想好了么? 小Ho:肿抢着呢(正想着呢)...<吞咽>...我记得这个问题上课有提到过,应该是一元一次方程组吧。 我们把每一件商品的价格看作是x[1]..x[n],第i个组合中第j件商品数量记为a[i][j],其价格记作y[i],则可以列出方程式: a[1][1] * x[1] + a[1][2] * x[2] + ... +