计蒜客_最短路_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;
}