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 

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

  • 相关阅读:
    高级I/O之存储映射I/O
    高级I/O之readn和writen函数
    高级I/O之readv和writev函数
    高级I/O之异步I/O
    高级I/O之I/O多路转接——pool、select
    高级I/O之STREAMS
    高级I/O之记录锁
    高级I/O之非阻塞I/O
    用于守护进程的出错处理函数
    守护进程之客户进程-服务器进程模型
  • 原文地址:https://www.cnblogs.com/blowhail/p/11245543.html
Copyright © 2011-2022 走看看