POJ 1125 单源最短路 dijkstra的算法初步探索

 
 
//好久没有写对题了,心里有点慌,这题遇到了很大的障碍,
//debug了好久 还是太不熟悉了
//最短路
//边权为正,有向边
//可能会有不连通的点哦
//用dijkstra算法应该可行
//现在自己试试
//忘记返回函数的值了,还有把源点去掉
//这个复杂度是n三方的
#include<cstdio>
#include<cstring>
#include<algorithm>
#define INF 1000+100
using namespace std ;

const int maxn = 100 + 10 ;
int w [ maxn ][ maxn ]; //边的权值
int d [ maxn ];
bool vis [ maxn ];
int fa [ maxn ];
int n ;
void read_graph ( void )
{
for ( int i = 1 ; i <= n ; i ++ )
for ( int j = 1 ; j <= n ; j ++ )
w [ i ][ j ] = INF ;
memset ( fa , 0 , sizeof ( fa ));
for ( int i = 1 ; i <= n ; i ++ ) //读入图
{
int m ; //边的个数
int v , t ; //边的一个端点和所耗费的时间
scanf ( "%d" , & m );
for ( int j = 1 ; j <= m ; j ++ )
{
scanf ( "%d %d" , & v , & t );
w [ i ][ v ] = t ;
}
}
/* for(int i=1;i<=n;i++)
// for(int j=1;j<=n;j++)
// printf("%d%c",w[i][j],j==n?'\n':' ');
*/
}
int dijkstra ( int s )
{
//dijkstra
memset ( vis , false , sizeof ( vis )); //初始化所有点都没有访问过

for ( int i = 1 ; i <= n ; i ++ ) d [ i ] = INF ; //初始化距离
d [ s ] = 0 ;

int ans = 0 ;
for ( int i = 1 ; i <= n ; i ++ )
{
int x , m = INF ;
for ( int j = 1 ; j <= n ; j ++ )
{
if ( ! vis [ j ] && m >= d [ j ]){ m = d [ j ]; x = j ; }

}
vis [ x ] = 1 ;
for ( int y = 1 ; y <= n ; y ++ )
{
if ( d [ y ] > d [ x ] + w [ x ][ y ]) { d [ y ] = d [ x ] + w [ x ][ y ]; fa [ y ] = x ; }
}

}
for ( int i = 1 ; i <= n ; i ++ ) { if ( i != s ) ans = max ( ans , d [ i ]);}
return ans ;
}
int main ()
{

while ( scanf ( "%d" , & n ) && n != 0 )
{
int anss = 0 ;
int ans = INF ;
read_graph ();
for ( int i = 1 ; i <= n ; i ++ )
{
int temp = dijkstra ( i );
if ( temp < ans ) { ans = temp ; anss = i ; }
}
if ( ans == INF ) printf ( "disjoint \n " );
else printf ( "%d %d \n " , anss , ans );

}
return 0 ;
}
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值