zoukankan      html  css  js  c++  java
  • 图论基础模板

    ① Floyd 

    多源最短路

    #include <cstdio>
    #include <iostream>
    #include <algorithm>
    #include <cstring>
    #include <string>
    #include <stack>
    #include <queue>
    #include <cmath>
    #define ll long long
    #define pi 3.1415927
    #define INF 0x3f3f3f3f
    using namespace std;
    int dis[1005][1005],n;
    void floyd (int n)
    {
        int i,j,k;
        for(k=0;k<n;++k)
            for(i=0;i<n;++i)
                for(j=0;j<n;++j)
                if(dis[i][j]>dis[i][k]+dis[k][j])
                    dis[i][j]=dis[i][k]+dis[k][j];
        ///floyd的核心,挨个遍历,找出最短距离
    }
    int main ()
    {
        int n,m,i,t,j,k,x,y,p;
        scanf("%d",&n);
        memset(dis,INF,sizeof(dis)); //将距离初始化为最大值
        while(cin>>x>>y>>p)
            dis[x][y]=p;
    
        for(i=0;i<n;++i)     //自己到自己的距离为 0 
            dis[i][i]=0;
    
        floyd(n);
    
        for(i=0;i<n;++i){
            for(t=0;t<n;++t)
                cout<<dis[i][t]<<" ";
            cout<<endl;
        }
        return 0;
    }

    ② dijkstra 

    单源最短路

    #include <cstdio>
    #include <iostream>
    #include <algorithm>
    #include <cstring>
    #include <string>
    #include <stack>
    #include <queue>
    #include <cmath>
    #define ll long long
    #define pi 3.1415927
    #define inf 0x3f3f3f3f
    using namespace std;
    int dis[1005],sign[1005],cost[1005][1005];
    //dis[i] 点i到点0的距离   sign标记  cost[i][j] 点i到点j的距离
    void init(int n)
    {
        //初始化
        memset(dis,inf,sizeof(dis));
        memset(sign,0,sizeof(sign));
        memset(cost,inf,sizeof(cost));
        //自己到自己的距离为零
        for(int i=0;i<n;++i)
            cost[i][i]=0;
    }
    void dijkstra (int n,int s)
    {
        dis[0]=0;
        int i;
        while(1){
            int f=-1;
            for(i=0;i<n;++i)  //遍历每一个点,寻找到原点的最短距离
                if(!sign[i] && (f==-1 || dis[i]<dis[f] ))
                    f=i;
            if(f==-1)
                break;
            sign[f]=1;
            for(i=0;i<n;++i)  //更新最短距离
                dis[i]=min(dis[i],dis[f]+cost[f][i]);
        }
        
    }
    int main ()
    {
        int n,m,i,t,j,k,x,y,p;
        cin>>n;
        init(n);
        while(cin>>x>>y>>p)
            cost[x][y]=p;
    
        dijkstra(n,0);
        for(i=0;i<n;++i)
            cout<<dis[i]<<" ";
    
        return 0;
    }

    ③ SPFA 

    单源最短路,可处理负边权

  • 相关阅读:
    Spring@Profile注解
    day 32 子进程的开启 及其用法
    day 31 udp 协议SOCK_DGRAM
    day 30 客户端获取cmd 命令的步骤
    day 29 socket 理论
    day 29 socket 初级版
    有关 组合 继承
    day 27 多态 接口 类方法 静态方法 hashlib 摘要算法模块
    新式类和经典类的区别
    day 28 hasattr getattr serattr delattr 和带__内置__ 类的内置方法
  • 原文地址:https://www.cnblogs.com/blowhail/p/11245543.html
Copyright © 2011-2022 走看看