hdu 1879 prime 继续畅通工程

来源:互联网 发布:facebook登录网络异常 编辑:程序博客网 时间:2024/06/05 18:48

题目 http://acm.hdu.edu.cn/showproblem.php?pid=1879

这个题目一开始想通二个来标记  后面发现不要了  ,其实如果A B点间有路那么直接说这个距离是0  这样就可以了 

  然后就是想其他求最小生成树一样哦。。

具体看代码哦

#include<iostream>#include<cstring>#include<cstdio>using namespace std;#define inf 999999int map[101][101];int dis[101];bool mark[101];int n;void prime(){    memset(dis,0,sizeof(dis));    memset(mark,false,sizeof(mark));    int i,j,k,min,sum;    for(i=1;i<=n;i++)    dis[i]=map[1][i];     k=0;     dis[1]=0;     sum=0;    mark[1]=true;    for(i=2;i<=n;i++)    {        min=inf;        for(j=1;j<=n;j++)        {            if(!mark[j]&&dis[j]<min)            {                min=dis[j];                k=j;            }        }        mark[k]=true;        sum+=min;        for(j=1;j<=n;j++)        {            if(!mark[j]&&dis[j]>map[k][j])            {                dis[j]=map[k][j];            }        }    }   cout<<sum<<endl;}int main(){    int i,j,m1,m2,k,v;    while(scanf("%d",&n)!=EOF,n)    {        memset(map,inf,sizeof(map));         j=n*(n-1)/2;        for(i=1;i<=j;i++)        {            cin>>m1>>m2>>k>>v;            if(v){ map[m1][m2]=map[m2][m1]=0;}  ///这里就是我上面所说的。。            else  {map[m1][m2]=map[m2][m1]=k;}        }       prime();    }    return 0;}


 

原创粉丝点击