计蒜客_最短路_floyd_dijkstra

计蒜客_最短路_floyd_dijkstra

// floyd
#include<bits/stdc++.h>
using namespace std;

const int INF=0x3f3f3f3f;
const int N=111;
int dp[N][N];
int n,m;

void init()
{
    memset( dp,0x3f,sizeof( dp ) );
    for( int i=0;i<N;i++ ) dp[i][i]=0;
}

void floyd()
{
    int i,j,k;
    for( k=1;k<=n;k++ )
        for( i=1;i<=n;i++ )
            for( j=1;j<=n;j++ )
                dp[i][j]=min( dp[i][j],dp[i][k]+dp[k][j] );
}

int main()
{
    int x,y,data;
    
    while( cin>>n>>m && ( n|| m ) )
    {
        init();
        while( m-- )
        {
            cin>>x>>y>>data;
            dp[x][y]=dp[y][x]=min( dp[x][y],data );
        }
        floyd();
        cout<<dp[1][n]<<endl;
    }
    return 0;
}

// dijkstra
#include<bits/stdc++.h>
using namespace std;

const int INF=0x3f3f3f3f;
const int N=111;
int in[N][N];
int dis[N];
bool used[N];
int n,m;

void init()
{
    memset( in,0x3f,sizeof( in ) );
    memset( dis,0,sizeof( dis ) );
    memset( used,0,sizeof( used ) );
    for( int i=0;i<N;i++ ) in[i][i]=0;
}

void dijkstra( int start )
{
    int i,j,min_dis,tpos;

    for( i=1;i<=n;i++ ) dis[i]=in[start][i];
    used[start]=1;

    for( i=1;i<=n;i++ )                     // i=1 j=1
    {
        min_dis=INF;
        tpos=0;

        for( j=1;j<=n;j++ )
            if( used[j]==0 && min_dis > dis[j] )
            {
                min_dis=dis[j];
                tpos=j;
            }
        for( j=1;j<=n;j++ )
            if( used[j]==0 && dis[j] > dis[tpos] + in[tpos][j] )
                dis[j]=dis[tpos]+in[tpos][j];
        used[tpos]=1;
    }
}

int main()
{
    int start,x,y,data,i;

    while( cin>>n>>m && ( n || m ) )        // 
    {
        init();
        while( m-- )
        {
            cin>>x>>y>>data;
            in[x][y]=in[y][x]=min( in[x][y],data );
        }
        dijkstra( 1 );
        cout<<dis[n]<<endl;
    }
    return 0;
}

猜你喜欢

转载自blog.csdn.net/qq_63173957/article/details/125340249