Constructing Roads POJ

来源:互联网 发布:数据量化方法 编辑:程序博客网 时间:2024/06/08 03:01
/**题意:有n个村子,他们现在需要修路,给出每两个村庄的距离,求连通村庄所需修路的最短长度,但是有些路已经是修好了,所以不需要重修,简单的说就是边值为0;这个也没什么,很简单;*/#include<cstdio>#include<cmath>#include<cstring>using namespace std;const int inf=0x3f3f3f3f;const int maxn=1e2+7;int dis[maxn],mmp[maxn][maxn],ans;bool vis[maxn];int n,m;void prim(){    ans=0;    for(int i=1;i<=n;i++)    {        dis[i]=mmp[1][i];        vis[i]=0;    }    vis[1]=1;    for(int i=1;i<=n;i++)    {        int k=-1;        double Min=inf;        for(int j=1;j<=n;j++)        {            if(!vis[j]&&dis[j]<Min)            {                Min=dis[j];                k=j;            }        }        if(k==-1) break;        vis[k]=1;        ans+=Min;        for(int j=1;j<=n;j++)            if(!vis[j]&&dis[j]>mmp[k][j])            dis[j]=mmp[k][j];    }    printf("%d\n",ans);}int main (){    scanf("%d",&n);    for(int i=1;i<=n;i++)        for(int j=1;j<=n;j++)        if(i==j) mmp[i][j]=0;    else mmp[i][j]=inf;    for(int i=1;i<=n;i++)        for(int j=1;j<=n;j++)        scanf("%d",&mmp[i][j]);        scanf("%d",&m);        for(int i=1;i<=m;i++)        {            int a,b;            scanf("%d %d",&a,&b);            mmp[a][b]=mmp[b][a]=0;        }        prim();    return 0;}
原创粉丝点击