图论总结

1、图的储存方式

    (1)邻接矩阵。   用map[i][j]表示i、j两点是否联通。

    (2)邻接表。    

1 struct node{int y,next,v;}e[MAXN];
2 int len,Link[MAXN];
3 void insert(int x,int y,int z)
4 {
5     e[++len].next=Link[x];
6     Link[x]=len;
7     e[len].y=y;
8     e[len].v=z;
9 }

    (3)边表。

1 struct node{int x,y,v;}e[MAXN];
2 int len;
3 void insert(int x,int y,int z)
4 {
5     e[++len].x=x;
6     e[len].y=y;
7     e[len].v=z;
8 }

2、图的遍历。

     dfs或bfs,学过搜索都会写,不再附代码了。

3、最短路。

    (1)floyd

多源最短路,时间复杂度:O(n^3),存图方式:邻接矩阵。

1 void floyd()
2 {
3     for(int k=1;k<=n;k++)
4         for(int i=1;i<=n;i++)
5             for(int j=1;j<=n;j++)
6                 if(dis[i][k]+dis[k][j]<dis[i][j])  {dis[i][j]=dis[i][k]+dis[k][j];   path[i][j]=k;}
7 }

输出路径

1 void dfs(int i,int j)
2 {
3     if (path[i][j]>0)
4     {
5         dfs(i,path[i][j]);
6         cout<<path[i][j]<<‘ ‘;
7         dfs(path[i][j],j);
8     }
9 }

    (2)dijkstra

单源最短路,时间复杂度:O(n^2),存图方式:邻接矩阵或邻接表。

 1 void dijkstra(int st)
 2 {
 3     for(int i=1;i<=n;i++)  dis[i]=map[st][i];
 4     memset(vis,0,sizeof(vis));
 5     vis[st]=1;  dis[st]=0;
 6     for(int i=1;i<n;i++)
 7     {
 8         int minn=100000000,k=0;
 9         for(int j=1;j<=n;j++)
10             if(!vis[j]&&dis[j]<minn)  {minn=dis[j];  k=j;}
11         if(k==0)  return;
12         vis[k]=1;
13         for(int j=1;j<=n;j++)
14             if(!vis[j]&&map[k][j]+dis[k]<dis[j])  {dis[j]=map[k][j]+dis[k];  path[j]=k;}
15     }
16 }

可用堆优化之,将时间复杂度降到O(nlogn)

 1 void dijkstra(int st)
 2 {
 3     fill(dis+1,dis+n+1,INF);
 4     dis[st]=0;  vis[st]=1;
 5     pii temp=make_pair(dis[st],st);
 6     q.push(temp);
 7     for(int i=1;i<=n;i++)
 8     {
 9         while(!q.empty())
10         {
11             temp=q.top();
12             q.pop();
13             if(!vis[temp.second])  break;
14         }
15         int k=temp.second;
16         vis[k]=1;
17         for(int j=Link[k];j;j=e[j].next)
18             if(dis[k]+e[j].v<dis[e[j].y])
19             {
20                 dis[e[j].y]=dis[k]+e[j].v;
21                 temp=make_pair(dis[e[j].y],e[j].y);
22                 q.push(temp);
23             }
24     }
25 }

    (3)SPFA

单源最短路,时间复杂度:O(nlogn),存图方式:邻接表。

 1 void spfa(int st)
 2 {
 3     memset(dis,10,sizeof(dis));
 4     dis[st]=0;  vis[st]=1;
 5     q[++tail]=st;
 6     while(++head<=tail)
 7     {
 8         int tn=q[head];
 9         vis[tn]=0;
10         for(int i=Link[tn];i;i=e[i].next)
11         {
12             int tmp=e[i].y;
13             if(dis[tn]+e[i].v<dis[tmp])
14             {
15                 dis[tmp]=dis[tn]+e[i].v;
16                 if(!vis[tmp])
17                 {
18                     q[++tail]=tmp;
19                     vis[tmp]=1;
20                 }
21             }
22         }
23     }
24 }

4、最小生成树。

    (1)Prim,时间复杂度:O(n^2),存图方式:邻接矩阵。

 1 void prim(int st)
 2 {
 3     for(int i=1;i<=n;i++)  dis[i]=map[st][i];
 4     memset(vis,0,sizeof(vis));
 5     vis[st]=1;  dis[st]=0;
 6     for(int i=1;i<n;i++)
 7     {
 8         int minn=100000000,k=0;
 9         for(int j=1;j<=n;j++)
10             if(!vis[j]&&dis[j]<minn)  {minn=dis[j];  k=j;}
11         if(k==0)  return;
12         vis[k]=1;
13         ans+=dis[k];
14         for(int j=1;j<=n;j++)
15             if(!vis[j]&&map[k][j]<dis[j])  dis[j]=map[k][j];
16     }
17 }

    (2)Kruskal,时间复杂度:O(nlogn),存图方式:边表。

 1 bool cmp(node a,node b)
 2 {return a.v<b.v;}
 3 int find(int x)
 4 {return f[x]==x?x:f[x]=find(f[x]);}
 5 void kruskal()
 6 {
 7     for(int i=1;i<=n;i++)  f[i]=i;
 8     int k=0;
 9     sort(e+1,e+m+1,cmp);
10     for(int i=1;i<=m;i++)
11     {
12         int u=find(e[i].x),v=find(e[i].y);
13         if(u!=v)
14         {
15             f[u]=v;
16             ans+=e[i].v;
17             k++;
18         }
19         if(k==n-1)  break;
20     }
21 }

时间: 2024-08-24 04:17:17

图论总结的相关文章

第九节 图论和搜索

1. 图论算法(用BFS,DFS) 拓扑排序 克隆图 找连通块 六度问题 2.BFS 队列实现:    树中的BFS与图中的BFS有什么不同?树中没有环,图中有环需要一个set来记录搜索过的节点: 应用:图的遍历,最短路径 3 搜索   搜索题的套路比较固定.

图论(A*算法,K短路) :POJ 2449 Remmarguts&#39; Date

Remmarguts' Date Time Limit: 4000MS   Memory Limit: 65536K Total Submissions: 25216   Accepted: 6882 Description "Good man never makes girls wait or breaks an appointment!" said the mandarin duck father. Softly touching his little ducks' head, h

ACM 图论入门

①图论基础 图由点和边组成 记顶点集合为V 边集合为E的图为G=(V,E) 图可分为有向图和无向图.如表示朋友关系的图为无向图,表示点之间大小关系的图为有向图. 边也可以带有权值,带有权值称为有权图,不带有权值称为 无权图. 一.关于无向图 任意两点之间都有路径的图叫做连通图,顶点连接的边数称为这个点的度. 没有环的连通图就是树,没有环的非连通图就是森林. 一棵树的边数=顶点数-1.反之 边数=顶点数-1的连通图就是树. 二.关于有向图 以一个点为起点的边数称作这个点的出度,以一个点为终点的边数

Codeforces 444A DZY Loves Physics(图论)

题目链接:Codeforces 444A DZY Loves Physics 题目大意:给出一张图,图中的每个节点,每条边都有一个权值,现在有从中挑出一张子图,要求子图联通,并且被选中的任意两点,如果存在边,则一定要被选中.问说点的权值和/边的权值和最大是多少. 解题思路:是图论中的一个结论,最多两个节点,所以枚举两条边就可以了.我简单的推了一下,2个点的情况肯定比3个点的优. 假设有3个点a,b,c,权值分别为A,B,C 现a-b,b-c边的权值分别为u,v 那么对于两点的情况有A+Bu,B+

图论算法之DFS与BFS

概述(总) DFS是算法中图论部分中最基本的算法之一.对于算法入门者而言,这是一个必须掌握的基本算法.它的算法思想可以运用在很多地方,利用它可以解决很多实际问题,但是深入掌握其原理是我们灵活运用它的关键所在. 含义特点 DFS即深度优先搜索,有点类似广度优先搜索,也是对一个连通图进行遍历的算法.它的思想是从一个顶点V0开始,沿着一条路一直走到底,如果发现不能到达目标解,那就返回到上一个节点,然后从另一条路开始走到底,这种尽量往深处走的概念即是深度优先的概念. 由于用到递归,当节点特别多且深度很大

codevs——1019 集合论与图论

1019 集合论与图论 时间限制: 1 s 空间限制: 128000 KB 题目等级 : 黄金 Gold 题解 查看运行结果 题目描述 Description 集合论与图论对于小松来说是比数字逻辑轻松,比数据结构难的一门专业必修课.虽然小松在高中的时候已经自学过了离散数学中的图论,组合,群论等知识.但对于集合论,小松还是比较陌生的.集合论的好多东西也涉及到了图论的知识. 在第四讲的学习中,小松学到了“有序对”这么一个概念,即用<x, y>表示有序对x和y.要注意的是有序对<x, y>

关于图论的若干巴拉巴拉

最近课堂上正在讲图论 先安利MIT课程:http://open.163.com/special/opencourse/algorithms.html 因为本人对图论的概念并不是很清楚,所以还是整理一下吧. 1.图论的基本概念 几种常见的图的分类: 类型 边 允许多重边 允许环 简单图 无向 否 否 多重图 无向 是 否 伪图 无向 是 是 有向图 有向 否 是 有向多重图 有向 是 是 完全图:n个顶点上的完全图是在每对不同顶点之间都恰有一条边的简单图. 二分图:若把简单图G的顶点集合分为两个不

cdoj1580 简单图论问题

地址:http://acm.uestc.edu.cn/#/problem/show/1580 题目: 简单图论问题 Time Limit: 3000/1000MS (Java/Others)     Memory Limit: 65535/65535KB (Java/Others) Submit Status 给出一个无向图,该图由nn个点和mm条边组成,每个点和每条边都有一个权值.对于该图的任意一个子图,我们定义A是该子图的点权和,B是该子图的边权和,C=A/b=AB是该子图的powerpow

SDUT 3361 数据结构实验之图论四:迷宫探索

数据结构实验之图论四:迷宫探索 Time Limit: 1000MS Memory Limit: 65536KB Submit Statistic Discuss Problem Description 有一个地下迷宫,它的通道都是直的,而通道所有交叉点(包括通道的端点)上都有一盏灯和一个开关:请问如何从某个起点开始在迷宫中点亮所有的灯并回到起点? Input 连续T组数据输入,每组数据第一行给出三个正整数,分别表示地下迷宫的结点数N(1 < N <= 1000).边数M(M <= 30

SDUT 2141 【TEST】数据结构实验图论一:基于邻接矩阵的广度优先搜索遍历

数据结构实验图论一:基于邻接矩阵的广度优先搜索遍历 Time Limit: 1000MS Memory Limit: 65536KB Submit Statistic Discuss Problem Description 给定一个无向连通图,顶点编号从0到n-1,用广度优先搜索(BFS)遍历,输出从某个顶点出发的遍历序列.(同一个结点的同层邻接点,节点编号小的优先遍历) Input 输入第一行为整数n(0< n <100),表示数据的组数.对于每组数据,第一行是三个整数k,m,t(0<