图论

原创 2016年08月30日 21:29:53

图论


图的储存

1.邻接矩阵

2.邻接表

struct tyc{int x,t,l,ne;} e[M];
int v[N];
void put (int x,int y,int l){
    num++;e[num]={x,y,l,v[x]};
    v[x]=num;
}

//枚举点x的所有出边
for(int i=v[x];i;i=e[i].ne) i是出边

最短路径

floyd

//复杂度O(n^3)
for(int k=1;k<=n;k++)
    for(int i=1;i<=n;i++)
        for(int j=1;j<=n;j++)
            dis[i][j]=min(dis[i][k]+dis[k][j],dis[i][j]);

dijkstra

需要注意的是:dijkstra无法用于处理带负权值的图

dijkstra的主要思路是分蓝白点,确定最短路长度的是白点,蓝点反之。
复杂度是相对比较优秀的O(n^2);

    int S=1;
    memset(vis,0,sizeof(vis));
    for(int i=1;i<=n;i++){
        if(dis[S][i]!=-1) d[i]=dis[S][i];
        else d[i]=inf;
    }
    int k=0;
    vis[S]=true;
    d[0]=inf;
    for(int i=1;i<n;i++){
        int mn=inf,k=0;
        for(int j=1;j<=n;j++)
            if(!vis[j] && d[j]<=mn)  mn=d[j],k=j;//用变量mn筛出此时距离S最近的点
        vis[k]=1;
        for(int j=1;j<=n;j++){
            if(!vis[j] && dis[k][j]!=-1)
                d[j]=min(d[j],dis[k][j]);
        }
    }

上述代码,如果加上常数,其复杂度应是O(2*n^2)。
值的注意的是,通过堆进行优化的dijkstra复杂度更加优秀,可以达到O(n*(logn+n)),当数据很大的时候,会比上述复杂度优秀不少。

//堆优化后的dij
struct tyc {
    int id,v;//v 表示上文中的d[x]
    friend bool operator < (tyc a,tyc b) {
        return a.v>b.v;
    } 
};

priority_queue<tyc> que;

void Dijkstra(){
    int S=1;
    memset(vis,0,sizeof(vis));
    for(int i=1;i<=n;i++){
        if(dis[S][i]!=-1) d[i]=dis[S][i];
        else d[i]=inf;
    }
    que.push((tyc){1,0});
    rep(i,1,n){
        que.push((tyc){i,d[i]});
    }
    int x,y;
    d[0]=inf;
    while(!que.empty()){
        x = que.top().id, y = que.top().v;
        que.pop();
        if(vis[x]) continue;
        vis[x]=1;
        for(int j=1;j<=n;j++) {
            if(vis[j]) continue;
            if(dis[x][j]!=-1 && dis[x][j] < d[j]) {
                d[j] = dis[x][j];
                que.push((tyc){j,d[j]});
            }
        }
    }
}

最小生成树

Prim

基本思路与Dijkstra相同

int Prim(){ 
    int ans=0;
    int S=1;
    memset(vis,0,sizeof(vis));
    for(int i=1;i<=n;i++){
        if(dis[S][i]!=-1) d[i]=dis[S][i];
        else d[i]=inf;
    }
    int k=0;
    vis[S]=true;
    d[0]=inf;
    for(int i=1;i<n;i++){
        int mn=inf,k=0;
        for(int j=1;j<=n;j++)
            if(!vis[j] && d[j]<=mn)  mn=d[j],k=j;//用变量mn筛出此时距离S最近的点
        vis[k]=1;
        ans+=d[k];//!!!!!!!!!!!
        for(int j=1;j<=n;j++){
            if(!vis[j] && dis[k][j]!=-1)
                d[j]=min(d[j],dis[k][j]);
        }
    }
    return ans;
}

堆优化版:


struct tyc {
    int id,v;//v 表示上文中的d[x]
    friend bool operator < (tyc a,tyc b) {
        return a.v>b.v;
    } 
};

priority_queue<tyc> que;



int Prim(){ 
    int ans=0;
    int S=1;
    memset(vis,0,sizeof(vis));
    for(int i=1;i<=n;i++){
        if(dis[S][i]!=-1) d[i]=dis[S][i];
        else d[i]=inf;
    }
    que.push((tyc){1,0});
    rep(i,1,n){
        if(d[i]==inf) continue;
        que.push((tyc){i,d[i]});
    }
    int x,y;
    d[0]=inf;
    while(!que.empty()){
        x = que.top().id, y = que.top().v;
        que.pop();
        if(vis[x]) continue;
        vis[x]=1;
        ans+=y;
        for(int j=1;j<=n;j++) {
            if(vis[j]) continue;
            if(dis[x][j]!=-1 && dis[x][j] < d[j]) {
                d[j] = dis[x][j];
                que.push((tyc){j,d[j]});
            }
        }
    }   
版权声明:本文为博主原创文章,未经博主允许不得转载。

Python 图论工具

networkx: 一个用Python语言开发的图论与复杂网络建模工具, 内置了常用的图与复杂网络分析算法, 可以方便的进行复杂网络数据分析、仿真建模等工作。 依赖工具: numpy  p...
  • u011659057
  • u011659057
  • 2014年06月17日 20:20
  • 2199

图论汇总

开学开始刷~ 最短路问题 此类问题类型不多,变形较少 POJ 2449 Remmarguts' Date(中等) http://acm.pku.edu.cn/JudgeOnline...
  • zhou_yujia
  • zhou_yujia
  • 2016年02月03日 11:31
  • 1182

·图论与动态规划

1  找无环
  • brandohero
  • brandohero
  • 2014年10月15日 12:42
  • 836

图论(一)基本概念

图(graph)是数据结构和算法学中最强大的框架之一(或许没有之一)。图几乎可以用来表现所有类型的结构或系统,从交通网络到通信网络,从下棋游戏到最优流程,从任务分配到人际交互网络,图都有广阔的用武之地...
  • saltriver
  • saltriver
  • 2017年01月14日 20:47
  • 10526

【matlab】《图论》-完全图仿真

% % 完全图 close all; N=30; t=0: 2*pi/N: 2*pi; x = sin(t); y = cos(t); figure('Name','Point-Line'); ho...
  • u013346007
  • u013346007
  • 2017年02月23日 18:51
  • 958

[图] 图论基本介绍

图是表示一些事物或者状态的关系的表达方法。由于许多问题都可以归约为图的问题,所以我们创建了很多跟图相关的算法。因此,在程序设计竞赛中有很多需要直接对图进行处理或者间接用图来解决的问题。 1、...
  • u012848631
  • u012848631
  • 2015年08月10日 11:11
  • 1688

在图论中,网络流(Network Flow)

在图论中,网络流(Network Flow)是指在一个每条边都有容量(Capacity)的有向图分配流,使一条边的流量不会超过它的容量。(边有附带容量的图称为网络。)一道流必须符合一个结点的进出的流量...
  • u012116229
  • u012116229
  • 2015年03月11日 20:26
  • 2293

匹配 (图论)

在图论中,一个图是一个匹配(或称独立边集)是指这个图之中,任意两条边都没有公共的顶点。这时每个顶点都至多连出一条边,而每一条边都将一对顶点相匹配。 严格定义[编辑] 对于一个给定的图G =...
  • u012116229
  • u012116229
  • 2015年03月11日 21:32
  • 1241

图论术语

基本术语[编辑] 一个图(一般记作  )由两类元素构成,分别称为“顶点”(或节点、结点)和“边”。每条边有两个顶点作为其端点,我们称这条边“连接”了它的两个端点。因此,边可定义为由两个顶点构成的...
  • u012116229
  • u012116229
  • 2015年03月12日 09:28
  • 588

图论中的知识点

图论知识点
  • Acmer_le
  • Acmer_le
  • 2016年08月22日 16:51
  • 323
内容举报
返回顶部
收藏助手
不良信息举报
您举报文章:图论
举报原因:
原因补充:

(最多只允许输入30个字)