图论-有向图的连通性模板题(hdu1296)(hdu1827)

news/2024/7/5 3:12:40

1.强连通分量:
强连通分量可以理解为边数最少的情况下是一个环。
这里写了一个模板题用的是tarjan算法,当然还有其他算法。
tarjan算法的关键其实还是对于num数组和low数组的使用
然后可以用栈来分离不同的ssc
感觉跟双边连通分量有异曲同工之妙

第一题hdu1296

#pragma GCC optimize(3,"Ofast","inline")
#include <iostream>
#include <cstdio>
#include <cstring>
#include <cmath>
#include <math.h>
#include <string>
#include <list>
#include <set>
#include <map>
#include <queue>
#include <stack>
#include <algorithm>
#include <stdlib.h>
#define maxn  20010
//#define true false
//#define false true
const int MaxN = 0x3f3f3f3f;
const int MinN = 0xc0c0c00c;
const double pi = acos(-1);
typedef long long ll;
const int mod = 1e9 + 7;
using namespace std;
int n,m;
vector < vector<int> > maps;
int low[maxn];
int num[maxn];
int stacks[maxn],ssc[maxn];
int dfsnum=0,top,cnt;
void init(){memset(low,0,sizeof(low));memset(num,0,sizeof(num));memset(ssc,0,sizeof(ssc));dfsnum=0;top=0;cnt=0;
}
void dfs(int u){stacks[top++]=u;low[u]=num[u]=++dfsnum;for(int i=0;i<maps[u].size();i++){int v=maps[u][i];if(!num[v]){dfs(v);low[u]=min(low[v],low[u]);}else if(!ssc[v])  low[u]=min(low[u],num[v]);  //处理回退边}if(low[u]==num[u]){   //栈底的点是ssc的祖先,low=num值cnt++;while(true){int v=stacks[--top];ssc[v]=cnt;if(u==v)  break;}}
}void tarjan(){init();for(int i=1;i<=n;i++)   //因为最少便的情况下是一个环,所以说从哪个点开始走,都可以回到原始点if(!num[i])  dfs(i);
}int main()
{while(scanf("%d%d",&n,&m)&&n){init();maps.clear();maps.resize(10010);for(int i=0;i<m;i++){int x,y;scanf("%d%d",&x,&y);maps[x].push_back(y);}tarjan();if(cnt>1)  printf("No\n");else printf("Yes\n");}return 0;
}

第二题hdu1827
这个还是先用tarjan算法来求有多少个强连通分量,然后我们再用缩点的思想把一个强连通量当一个点来看,因为要最少的人,相当于找入度0的人来打电话。

#pragma GCC optimize(3,"Ofast","inline")
#include <iostream>
#include <cstdio>
#include <cstring>
#include <cmath>
#include <math.h>
#include <string>
#include <list>
#include <set>
#include <map>
#include <queue>
#include <stack>
#include <algorithm>
#include <stdlib.h>
#define maxn  2010
//#define true false
//#define false true
const int MaxN = 0x3f3f3f3f;
const int MinN = 0xc0c0c00c;
const double pi = acos(-1);
typedef long long ll;
const int mod = 1e9 + 7;
using namespace std;
int n,m;
vector < vector<int> > maps;
int low[maxn];
int num[maxn];
int stacks[maxn],ssc[maxn];
int dfsnum=0,top,cnt;
int price[maxn];
int cost[maxn];
int degree[maxn];
void init(){memset(low,0,sizeof(low));memset(num,0,sizeof(num));memset(ssc,0,sizeof(ssc));memset(degree,0,sizeof(degree));memset(cost,MaxN,sizeof(cost));dfsnum=0;top=0;cnt=0;
}
void dfs(int u){stacks[top++]=u;low[u]=num[u]=++dfsnum;for(int i=0;i<maps[u].size();i++){int v=maps[u][i];if(!num[v]){dfs(v);low[u]=min(low[v],low[u]);}else if(!ssc[v])  low[u]=min(low[u],num[v]);}if(low[u]==num[u]){cnt++;while(true){int v=stacks[--top];ssc[v]=cnt;cost[cnt]=min(cost[cnt],price[v]);if(u==v)  break;}}
}
void tarjan(){for(int i=1;i<=n;i++)if(!num[i]){dfs(i);}for(int i=1;i<=n;i++){for(int f=0;f<maps[i].size();f++){if(ssc[i]!=ssc[maps[i][f]])  degree[ssc[maps[i][f]]]++;}}int ans1=0,ans2=0;//for(int i=1;i<=n;i++)  cout<<degree[i]<<" ";for(int i=1;i<=cnt;i++){if(degree[i]==0)  ans2+=cost[i],ans1++;}printf("%d %d\n",ans1,ans2);
}int main()
{while(scanf("%d%d",&n,&m)!=EOF){init();maps.clear();maps.resize(1010);for(int i=1;i<=n;i++)  scanf("%d",&price[i]);for(int i=0;i<m;i++){int x,y;scanf("%d%d",&x,&y);maps[x].push_back(y);}tarjan();}return 0;
}

http://lihuaxi.xjx100.cn/news/286004.html

相关文章

10门必看的机器学习免费课程

整理 | 琥珀出品 | AI科技大本营&#xff08;ID: rgznai100&#xff09;文本将介绍来自全球10所著名学府的机器学习和数据科学领域的免费公开课程&#xff0c;范围涉及从入门机器学习到自然语言处理等。1、机器学习华盛顿大学链接&#xff1a;https://courses.cs.washington.ed…

用Python实现一个简单的线程池

线程池的概念是什么&#xff1f;在面向对象编程中&#xff0c;创建和销毁对象是很费时间的&#xff0c;因为创建一个对象要获取内存资源或者其它更多资源。在Java中更是 如此&#xff0c;虚拟机将试图跟踪每一个对象&#xff0c;以便能够在对象销毁后进行垃圾回收。所以提高服务…

根号均摊 ---- E. Xenia and Tree(树形dp + 暴力根号均摊)

题目大意 题目大意&#xff1a; 你有一颗树&#xff1a;树开始时候1号点是红色的 现在就是你有两次操作&#xff1a; 1 u 把u点涂成红色 2 u 询问离u点最近红点在哪里&#xff1f; 数据范围是n,m∈[1,1e5]n,m\in[1,1e5]n,m∈[1,1e5]时间限制是5s5s5s如果直接查询我们是可以直接…

转置卷积实现

import tensorflow as tf import numpy as np import tensorflow as keras from tensorflow.keras import layers,optimizers,losses #创建X矩阵&#xff0c;高宽各位5*5 xtf.range(16)1 #调整为合法的维度张量 xtf.reshape(x,[1,4,4,1]) xtf.cast(x,dtypetf.float32) #创建固定…

全家都是博士是一种什么样的体验?

那些在北大未名湖畔或者清华园里&#xff0c;寒窗苦读获得博士学位的学子&#xff0c;都是家长们眼中“别人的孩子”。身边的朋友以及街坊邻居听闻博士的名号&#xff0c;都会投来敬佩而崇拜的目光。虽然如今随着学历水涨船高&#xff0c;博士学位存在一定程度的贬值&#xff0…

来自程序员的福利!用Python做一款翻译软件

来源 | Ahab杂货铺&#xff08;ID&#xff1a;PythonLearningCamp&#xff09;前两天吃了平哥的一波狗粮&#xff0c;他给女朋友写了一个翻译软件&#xff0c;自己真真切切的感受到了程序员的浪漫。在学习requests请求的时候做过类似的Demo&#xff0c;给百度翻译发送一个post请…

记忆优化搜索(简单题)(洛谷P3183 [HAOI2016]食物链 )( P5635 【CSGRound1】天下第一 )

昨天做了蓝桥杯的时候&#xff0c;发现自己对于记忆优化搜索甚是不熟悉&#xff0c;所以今天随便找了几个基础题做做&#xff0c;顺便写下两片题解&#xff0c;顺便用了一下devc敲的代码&#xff0c;发现没有代码补全真的可以说是灰常难受了。。。 洛谷P3183 [HAOI2016]食物链 …

Springboot毕业设计毕设作品,纯净水商城配送系统 开题报告

本科生毕业论文 基于Java纯净水商城配送系统&#xff08;springboot框架&#xff09; 开题报告 学 院&#xff1a; 专 业&#xff1a; 计算机科学与技术 年 级&#xff1a; 学生姓名&#xff1a; …