【模板】最短路(SPFA)(Dijkstra)(Floyd)

mmp图真难呀

Floyd

#include <cstdio>
int main(){
    int e[10][10],k,i,j,n,m,t1,t2,t3;
    int inf=99999999; //用inf(infinity的缩写)存储一个我们认为的正无穷值
    //读入n和m,n表示顶点个数,m表示边的条数
    scanf("%d %d",&n,&m); 
    //初始化
    for(i=1;i<=n;i++)
        for(j=1;j<=n;j++)
            if(i==j) e[i][j]=0;
              else e[i][j]=inf;
    //读入边
    for(i=1;i<=m;i++)
    {
        scanf("%d%d%d",&t1,&t2,&t3);
        e[t1][t2]=t3;
    }
                              
    //核心语句
    for(k=1;k<=n;k++)
        for(i=1;i<=n;i++)
            for(j=1;j<=n;j++)
                if(e[i][j]>e[i][k]+e[k][j] )
                    e[i][j]=e[i][k]+e[k][j];
                              
    //输出最终的结果
    for(i=1;i<=n;i++)
    {
     for(j=1;j<=n;j++)
        {
            printf("%10d",e[i][j]);
        }
        printf("\n");
    }
                              
    return 0;
}

Dijkstra

const int INF=0x3f3f3f3f;
const int maxn=1200;

int dist[maxn],g[maxn][maxn],N;
bool vis[maxn];

void dijkstra()
{
    for(int i=1;i<=N;i++)
        dist[i]=(i==1)?0:INF;
    memset(vis,0,sizeof(vis));

    for(int i=1;i<=N;i++)
    {
        int mark=-1,mindis=INF;
        for(int j=1;j<=N;j++)
        {
            if(!vis[j]&&dist[j]<mindis)
            {
                mindis=dist[j];
                mark=j;
            }
        }
        vis[mark]=1;

        for(int j=1;j<=N;j++)
        {
            if(!vis[j])
            {
                dist[j]=min(dist[j],dist[mark]+g[mark][j]);
            }
        }
    }
}

SPFA

#include "bits/stdc++.h"

using namespace std;
const int maxN = 200010 ;
struct Edge
{
    int    to , next , w ;
} e[ maxN ];

int    n,m,cnt,p[ maxN ],Dis[ maxN ];
int    In[maxN ];
bool    visited[ maxN ];

void    Add_Edge ( const int x , const int y , const int z )
{
    e[ ++cnt ] . to = y ;
    e[ cnt ] . next = p[ x ]; 
    e[ cnt ] . w = z ;
    p[ x ] = cnt ;
    return ;
}

bool    Spfa(const int S)
{
    int    i,t,temp;
    queue<int>    Q;
    memset ( visited , 0 , sizeof ( visited ) ) ; 
    memset ( Dis , 0x3f , sizeof ( Dis ) ) ; 
    memset ( In , 0 , sizeof ( In ) ) ;
    
    Q.push ( S ) ;
    visited [ S ] = true ;
    Dis [ S ] = 0 ;

    while( !Q.empty ( ) ) 
    {
        t = Q.front ( ) ;Q.pop ( ) ;visited [ t ] = false ;
        for( i=p[t] ; i ; i = e[ i ].next )
        {
            temp = e[ i ].to ;
            if( Dis[ temp ] > Dis[ t ] + e[ i ].w )
            {
                Dis[ temp ] =Dis[ t ] + e[ i ].w ;
                if( !visited[ temp ] )
                {
                    Q.push(temp);
                    visited[temp]=true;
                    if(++In[temp]>n)return false;
                }
            }
        }
    }
    return true;
}

int main ( )
{
    int    S , T ;

    scanf ( "%d%d%d%d" , &n , &m , &S , &T ) ;
    for(int i=1 ; i<=m ; ++i )
    {
        int x , y , _ ;
        scanf ( "%d%d%d" , &x , &y , &_ ) ;
        Add_Edge ( x , y , _  ) ;
    }

    if ( !Spfa ( S ) ) printf ( "FAIL!\n" ) ;
    else               printf ( "%d\n" , Dis[ T ] ) ;

    return 0;
}

代码来源 懒得看懒得敲的我

Floyd很形象

Dijkstra很形象

SPFA很形象

猜你喜欢

转载自www.cnblogs.com/pushinl/p/8951985.html