HDOJ1102 Constructing Roads【最小生成树】-----武科大ACM暑期集训队选拔赛1题

这道题目没有做出来,代码写好之后一直没有AC,本以为做了这么多最小生成树的题目,这道题一定没问题的,结果很遗憾,没有注意细节问题:
首先,如何处理已经建好的路?已经建好的路说明这两个点是连通的,只要把他们间距设为0就好了。
其次,注意循环的控制,我把第一个for中的i=1写成i=0了。
Problem : 1102 ( Constructing Roads )     Judge Status : Accepted
RunId : 5913541    Language : C    Author : qq1203456195
Code Render Status : Rendered By HDOJ C Code Render Version 0.01 Beta
 
//最小生成树
#include<stdio.h>
#define N 1005
#define MAX 9999
int map[N][N],visited[N],close[N],n,q,a,b;
int main()
{
    int i,j,nxt,len,nid,flag=1;
    while(~scanf("%d",&n))
    {
        for(i=0;i<n;i++)
        {
            visited[i]=0;
            for(j=0;j<n;j++)
                scanf("%d",&map[i][j]);
        }
        scanf("%d",&q);
        for(i=0;i<q;i++)
        {
            scanf("%d%d",&a,&b);//ab in tree
            map[a-1][b-1]=map[b-1][a-1]=0;
        }
        visited[0]=1;
        for(j=0;j<n;j++)
                close[j]=map[j][0];
        len=0;
        for(i=1;i<n;i++)
        {
            nxt=MAX;
            for(j=0;j<n;j++)
            {
                if(!visited[j]&&close[j]<nxt)
                {
                    nxt=close[j];
                    nid=j;
                }        
            }
            len+=nxt;
            visited[nid]=1;
            for(j=0;j<n;j++)
            {
                if(!visited[j]&&map[j][nid]<close[j])
                    close[j]=map[j][nid];
            }
        }
        printf("%d\n",len);
        
    }
    return 0;
}

 

posted @ 2012-05-08 11:38  ZH奶酪  阅读(431)  评论(0编辑  收藏  举报