HDU 1102 Constructing Roads(prim)

来源:互联网 发布:淘宝蚂蚁花呗无法开通 编辑:程序博客网 时间:2024/06/06 02:18
有N个村庄,你需要修建道路使所有的村庄都连通,修建道路要花费一定的权值。有些道路已经修好,不用再修建,让你求出最少所需的权值。

直接的prim,将已经修过的路把权值修改为0即可,注意是多组数据。
#include<stdio.h>#include<string.h>int distance[5000];int record[100+5],weight[105][105];int i,j,k,N,Q;int findmin();//找出距离生成树最近的点void renew(int x);//直接的prim,将已经修改路的路段将其权值变为0int main(){    while(scanf("%d",&N)!=EOF)    {        int ans=0;        memset(record,0,sizeof(record));        for(i=1;i<=N;i++)            for(j=1;j<=N;j++)                scanf("%d",&weight[i][j]);        scanf("%d",&Q);        for(i=1;i<=Q;i++)        {            scanf("%d%d",&j,&k);            weight[j][k]=0;            weight[k][j]=0;        }        for(i=1;i<=N;i++)            distance[i]=weight[1][i];        record[1]=1;        for(i=1;i<N;i++)        {            j=findmin();            record[j]=1;            ans+=distance[j];            renew(j);        }        printf("%d\n",ans);    }    return 0;}int findmin(){    int i,j,k=99999;    for(i=2;i<=N;i++)        if(!record[i]&&k>distance[i])        {            k=distance[i];            j=i;        }    return j;}void renew(int x){    int i,j,k;    for(i=1;i<=N;i++)        if(!record[i]&&weight[i][x]<distance[i])            distance[i]=weight[i][x];}