题目:
在所给点中去掉一个点后的的最大的最短路径
分析:
我们可以枚举去掉的点,求取最短路,注意重边的处理
代码如下:
#include <iostream>
#include <algorithm>
#include <cstdio>
#include <cstring>
#include <queue>
#define MAX 51
using namespace std;
int n,m;
struct
{
int v,next,w;
}e[MAX*MAX<<1];
int mp[MAX][MAX];
int head[MAX];
int cc;
void add ( int u , int v , int w )
{
e[cc].v = v;
e[cc].w = w;
e[cc].next = head[u];
head[u] = cc++;
}
int dis[MAX];
int vis[MAX];
int spfa ( int no )
{
queue<int> q;
memset ( vis , 0 , sizeof ( vis ) );
memset ( dis , 0x3f , sizeof ( dis ) );
q.push( 1 );
vis[1] = 1;
dis[1] = 0;
while ( !q.empty() )
{
int temp = q.front ();
q.pop();
vis[temp] = 0;
for ( int i = head[temp]; i != -1 ; i = e[i].next )
{
int v = e[i].v;
if ( v == no ) continue;
if ( dis[v] > dis[temp] + e[i].w )
{
dis[v] = dis[temp] + e[i].w;
if ( vis[v] ) continue;
vis[v] = 1;
q.push ( v );
}
}
}
return dis[n];
}
int main ( )
{
int u , v , w ;
while ( scanf ( "%d%d" , &n , &m ) )
{
if ( !n && !m ) break;
memset ( head , -1 , sizeof ( head ) );
cc = 0;
memset ( mp , 0x3f , sizeof ( mp ) );
while ( m-- )
{
scanf ( "%d%d%d" , &u , &v , &w );
mp[u][v] = mp[v][u] = min ( mp[v][u] , w );
}
for ( int i = 1 ; i <= n ; i++ )
for ( int j = 1 ; j <= n ; j++ )
if ( i != j&& mp[i][j] != mp[0][0])
add ( i , j , mp[i][j] );
int ans = 0;
for ( int k = 2 ; k < n ; k++ )
ans = max ( spfa (k ) , ans );
if ( ans >= 10000000 ) puts ( "Inf" );
else printf ( "%d\n" , ans );
}
return 0;
}
579

被折叠的 条评论
为什么被折叠?



