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 

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

  • 相关阅读:
    公用表表达式(CTE)的递归调用
    c# 如何让tooltip显示文字换行
    实战 SQL Server 2008 数据库误删除数据的恢复
    SQL SERVER数据库中 是否可以对视图进行修改删除
    asp.net中实现文件批量上传
    sql server 2008学习2 文件和文件组
    sql server 2008学习3 表组织和索引组织
    sql server 2008学习4 设计索引的建议
    sql server 2008学习10 存储过程
    .net 调用 sql server 自定义函数,并输出返回值
  • 原文地址:https://www.cnblogs.com/blowhail/p/11245543.html
Copyright © 2011-2022 走看看