图论

【图论】【最小生成树】最优布线问题

女生的网名这么多〃 提交于 2020-01-28 07:48:43
Description 学校有n台计算机,为了方便数据传输,现要将它们用数据线连接起来。两台计算机被连接是指它们之间有数据线连接。由于计算机所处的位置不同,因此不同的两台计算机的连接费用往往是不同的。 当然,如果将任意两台计算机都用数据线连接,费用将是相当庞大的。为了节省费用,我们采用数据的间接传输手段,即一台计算机可以间接的通过若干台计算机(作为中转)来实现与另一台计算机的连接。 现在由你负责连接这些计算机,你的任务是使任意两台计算机都连通(不管是直接的或间接的)。 Input 输入文件wire.in,第一行为整数n(2<=n<=100),表示计算机的数目。此后的n行,每行n个整数。第x+1行y列的整数表示直接连接第x台计算机和第y台计算机的费用。 Output 输出文件wire.out,一个整数,表示最小的连接费用。 Sample Input 3 0 1 2 1 0 1 2 1 0 Sample Output 2(注:表示连接1和2,2和3,费用为2) 解题思路 很明显的最小生成树模板 kruskal算法 每次找最小的边,如果边连接的两个点不是一个集合的,那么就把这两个点连起来 不断找最短的边,并且这条边的两个点不在一个集合里 最后 顺便推一下 prim算法 #include < iostream > #include < cstdio > using namespace

12388. 图论割边

十年热恋 提交于 2020-01-26 15:15:03
n个顶点m条边,请求割边 输入格式: 第一行给定三个整数 n,m 。n 个城镇,m 条道路(双向道路)。接下来给出 m 行,每行两个正整数表示这两个城镇之间有边相连。 输出格式: 一个整数,有几条关键道路。 样例 1 : 输入:6 6 1 3 1 4 2 3 2 4 2 5 5 6 输出:2 说明:2-5和5-6是桥 1 #include <cstdio> 2 #include <vector> 3 #include <cstring> 4 5 6 using namespace std; 7 8 9 const int max_n = 1e5 + 10; 10 int n,m; 11 int num[max_n],low[max_n]; 12 int time_index,a,b; 13 vector<int> g[max_n]; 14 int ans; 15 16 17 void dfs(int cur,int fa) 18 { 19 ++time_index; 20 num[cur]=time_index; 21 low[cur]=time_index; 22 23 for(int i=0;i<g[cur].size();++i) 24 { 25 int v=g[cur][i]; 26 if(num[v]==0) 27 { 28 dfs(v,cur); 29 low[cur]

图论

我们两清 提交于 2020-01-26 10:49:16
1 最短路 2 第K短路 3 最小生成树(森林) 4 次小生成树 5 曼哈顿最小生成树 6 欧拉路径 7 DAG的深度优先搜索 8 图的割点、桥和双联通分支的基本概念 9 无向图找桥 10 无向图联通度(割) 11 最大团问题 12 最小树形图 13 一般图匹配带花树 14 LCA 15 生成树计数 16 有向图的最小树形图 17 有向图的强联通分量 18 弦图判断 19 弦图的Perfect Elimination 点排列 20 稳定婚姻问题 21 拓扑排序 22 双联通分支 23 无向图连通分支 24 有向图最小点基 25 Floyd求最小环 26 2-SAT 27 树的重心 原文链接:https://blog.csdn.net/Fire_to_cheat_/article/details/80028763 来源: https://www.cnblogs.com/sylvia1111/p/12233770.html

POJ2263(图论)

喜你入骨 提交于 2020-01-25 18:03:46
本题不难理解,画图后很容易看出。即求各城市每条给定起点和终点间通路的最小负载,并据此求出所有最小负载中的最大值。 解题思路:本题是迪杰斯特拉(Dijkstra)的变形,但不是单源点的最短路径,而是按路径中最大权值作为搜索方向。 注意:将城市名字转化为数组标号。 代码如下: View Code 1 #include < iostream > 2 #include < cstdio > 3 #include < cstring > 4 using namespace std; 5 #define Max 205 6 #define max(a,b) ((a)>(b)?(a):(b)) 7 #define min(a,b) ((b)>(a)?(a):(b)) 8 int map[Max][Max],visit[Max],d[Max],n,r,cn; 9 char city[Max][ 35 ]; 10 int match( char c[]) // 将城市名字转化为数组标号 11 { 12 int i; 13 for (i = 1 ;i <= cn;i ++ ) // 查找有没有与c相同的 14 if (strcmp(city[i],c) == 0 ) 15 return i; 16 strcpy(city[i],c); // 没有,加入 17 cn ++ ; // 城市数量加1 18

搜索与图论---DFS和BFS、树与图的存储和遍历

你说的曾经没有我的故事 提交于 2020-01-23 21:41:47
深度优先搜索 DFS 广度优先搜索 BFS 树与图的存储 树与图的深度优先遍历 树与图的广度优先遍历 拓扑排序 DFS与BFS DFS 尽可能往深处搜,当搜到头的时候才会回溯,然后继续向深处搜索。 DFS首先要考虑的是以何种顺序把某一道题的所有可能方案全部搜一遍 可以看成是一个非常执着的人 两个DFS的重要概念:回溯和剪枝 回溯 当走到头,无路可走的时候,先后 剪枝 提前判断当前的方案一定是不合法的,不用遍历其之后的方案,直接剪掉。 现在看一个最经典的只涉及到回溯的题: AW842 虽然样式很像一棵树,但是每次存储的时候存储的都是一条路径,当回溯的时候相对应的无用路径会被删除。而在写函数时就有一个隐含的栈来帮我们实现这个回溯的。这个栈结构可联想递归时的函数运行顺序。 回溯要注意的一点:回溯要恢复现场,即从碰壁回到原来可以分支的状态 dfs函数的结构如下: # include <iostream> # include <stdio.h> using namespace std ; const int N = 10 ; int n ; int path [ N ] ; //状态数组,存储走的哪条路径 //而且再每次触底返回再重新搜索时之前的数组会被覆盖,所以只需要开一个数组就好了 bool state [ N ] ; //一个bool数组来记录这个数是否被用过(true是用过了)

【图论】【最短路】城市问题

ⅰ亾dé卋堺 提交于 2020-01-22 21:17:49
Description 设有n个城市,依次编号为0,1,2,……,n-1(n<=100),另外有一个文件保存n个城市之间的距离(每座城市之间的距离都小于等于1000)。当两城市之间的距离等于-1时,表示这两个城市没有直接连接。求指定城市k到每一个城市i(0<=I,k<=n-1)的最短距离。 Input 第一行有两个整数n和k,中间用空格隔开;以下是一个NxN的矩阵,表示城市间的距离,数据间用空格隔开。 Output 输出指定城市k到各城市间的距离(从第0座城市开始,中间用空格分开) Sample Input 3 1 0 3 1 3 0 2 1 2 0 Sample Output 3 0 2 解题思路 模板SPFA,但是要注意编号从0开始 #include < iostream > #include < cstdio > #include < cstring > using namespace std ; const int maxn = 0x7fffffff ; struct DT { int to , l , next ; } a [ 30000 ] ; int dis [ 10000 ] , head [ 10000 ] , pd [ 6000 ] , n , m , k , Gun = maxn , num ; int h , t , v [ 10000 ] , f [

2020 wnnafly winter camp

久未见 提交于 2020-01-22 01:43:49
2020 wnnafly winter camp day 1。。,F题负数没搞出来,C题的式子也解不出来。 之后,每天上午的讲题,之前还好,每天能听懂一些, 就是数论那天,??? ![在这里插入图片描述](https://img-blog.csdnimg.cn/20200121103647590.png![在这里插入图片描述](https://img-blog.csdnimg.cn/20200121103414795.png 数学杀我,gg. 下午的训练赛,签到之后无一题能做出来,看dalao们如何ac,有些题在纸上推导一下或者实验一下,才能大致有思路。有些打表(手工)后可以找结论 比如day6 F,三角形,o(n) 就能出来(谜之数据范围n<=5000) 看着是图论,不一定是图论,看着是数学,不一定是数学。 来源: CSDN 作者: ??wa 链接: https://blog.csdn.net/wappes/article/details/104059585

一本通基础篇图论

我的梦境 提交于 2020-01-18 21:19:43
1341 一笔画问题 1 #include <cstdio> 2 #include <algorithm> 3 #include <stack> 4 using namespace std; 5 const int MAXN = 110000,MAXM = 510000; 6 stack <int> stk; 7 int head[MAXN],ind[MAXN]; 8 int to[MAXM],nxt[MAXM],idx[MAXM]; 9 int cnt,n,m; 10 void add(int x,int y,int i) 11 { 12 nxt[++cnt] = head[x]; 13 to[cnt] = y; 14 head[x] = cnt; 15 idx[cnt] = i; 16 } 17 void dete(int x,int y) 18 { 19 if (head[x] == y) 20 { 21 head[x] = nxt[y]; 22 return; 23 } 24 for (int i = head[x];i;i = nxt[i]) 25 if (nxt[i] == y) 26 { 27 nxt[i] = nxt[y]; 28 return; 29 } 30 } 31 void dfs(int x) 32 { 33 for (int i = head[x];i

图论——邻接表

十年热恋 提交于 2020-01-18 13:27:01
文章目录 图论——邻接表 邻接表表示 代码 复杂度分析 图论——邻接表 邻接表表示 对于上图的邻接表如下 0:1->2 意思是顶点0保持着一个链表,链表里存放顶点0的邻接顶点 1:0->3 意思是顶点1保持着一个链表,链表里存放顶点1的邻接顶点 2:0->3 3:1->2 代码 public class AdjList { private int V ; //顶点数 private int E ; //边数 private LinkedList < Integer > [ ] adj ; //邻接表,链表数组存储 public AdjList ( String filename ) { File file = new File ( filename ) ; try ( Scanner scanner = new Scanner ( file ) ) { V = scanner . nextInt ( ) ; //顶点数 if ( V <= 0 ) throw new RuntimeException ( "顶点个数必须大于0" ) ; adj = new LinkedList [ V ] ; for ( int i = 0 ; i < V ; i ++ ) { adj [ i ] = new LinkedList < > ( ) ; } E = scanner . nextInt

【图论】刻录光盘

大兔子大兔子 提交于 2020-01-17 17:03:08
Description 在PJOI2010夏令营快要结束的时候,很多营员提出来要把整个夏令营期间的资料刻录成一张光盘给大家,以便大家回去后继续学习。组委会觉得这个主意不错!可是组委会一时没有足够的空光盘,没法保证每个人都能拿到刻录上资料的光盘,又来不及去买了,怎么办呢? 组委会把这个难题交给了DYJ,DYJ分析了一下所有营员的地域关系,发现有些营员是一个城市的,其实他们只需要一张就可以了,因为一个人呢拿到光盘以后,其他人可以拿着U盘之类的东西去拷贝啊! 可是DYJ调查后发现,有些营员并不是那么合作,他们愿意某一些人到他那儿拷贝资料,当然也可能不愿意让另外一些人到他那儿拷贝资料,这与我们PJOI宣扬的团队合作精神格格不入! 现在假设总共有N个营员(2<=N<=200),每个营员的编号为1~N。DJY给每个人发了一张调查表,让每个营员填上自己愿意让哪些人到他那儿拷贝资料。当然,如果A愿意把资料拷贝给B,而B又愿意把资料拷贝给C,则一旦A获得了资料,则B、C也会获得资料。 现在请你编写一个程序,根据回收上来的调查表,帮助DZY计算出组委会至少要刻录多少张光盘,才能保证所有营员回去后都能得到夏令营资料? Input 先是一个数N,接下来N行,分别表示各个营员愿意把自己获得的资料拷贝给其他哪些营员。即输入数据的第N+1行表示第i个营员愿意把资料拷贝给那些营员编号,以一个0结束