正文

Zju 1586 QS Network2007-03-27 14:53:00

【评论】 【打印】 【字体: 】 本文链接:http://blog.pfan.cn/cruxd/24322.html

分享到:

这题显然还是用prim,经过优化后的prim效率可以达到O(n2)。 离省赛越来越近,我也越来越没有状态,这种小白题从昨天晚上开始做,做到断网;今天爬起来继续做,才发现是把a[i][k]赋值 无限大的条件写错了——无良的出题者居然加入了两个端点间距离可能为0的情况...... #include <cstdio>#include <string> int a[1010][1010], s[1010], dis[1010], t, n; void pd (){    int i;    for ( i = 0; i < n; i ++ )    {        printf ( "%d ", dis[i] );    }    printf ( "\n" );} void init (){    int i, k;    scanf ( "%d", &n );    for ( i = 0; i < n; i ++ )    {        scanf ( "%d", &s[i] );    }    for ( i = 0; i < n; i ++ )    {        for ( k = 0; k < n; k ++ )        {            scanf ( "%d", &a[i][k] );            if ( i == k )            {                a[i][k] = 9999;            }            else            {                a[i][k] += s[i] + s[k];            }        }    }    memset ( dis, 0, sizeof ( dis ) );} void prim (){    int i, k, sum = 0;    dis[0] = -1;    for ( i = 1; i < n; i ++ )    {        dis[i] = a[0][i];    }    for ( i = 1; i < n; i ++ )    {        //pd ();        int mx = 9999, j;        for ( k = 0; k < n; k ++ )        {            if ( dis[k] != -1 && dis[k] < mx )            {                j = k;                mx = dis[k];            }        }        sum += mx;        dis[j] = -1;        for ( k = 0; k < n; k ++ )        {            if ( a[j][k] < dis[k] )            {                dis[k] = a[j][k];            }        }    }    printf ( "%d\n", sum );} int main (){    //freopen ( "in.txt", "r", stdin );    scanf ( "%d", &t );    int i;    for ( i = 0; i < t; i ++ )    {        init ();        prim ();    }    return 0;}

阅读(3856) | 评论(0)


版权声明:编程爱好者网站为此博客服务提供商,如本文牵涉到版权问题,编程爱好者网站不承担相关责任,如有版权问题请直接与本文作者联系解决。谢谢!

评论

暂无评论
您需要登录后才能评论,请 登录 或者 注册