hdu3371

来源:互联网 发布:租电脑去哪个网站知乎 编辑:程序博客网 时间:2024/05/29 00:32

..//重边问题。。。

//感觉好坑。。。

#include<iostream>#include<stdio.h>using namespace std;const int MAX=999999999;int map[502][502],visit[502],low[502];int n;void prim(){    memset(visit,0,sizeof(visit));    int pos;    visit[1]=1;    pos=1;    int i,j,result=0;    for(i=1;i<=n;i++)    {            low[i]=map[pos][i];    }    for(i=1;i<n;i++)    {        int min=MAX;        for(j=1;j<=n;j++)        {            if(visit[j]==0&&min>low[j])            {                min=low[j];                pos=j;            }        }                result+=min;        if(result>=MAX)            break;        visit[pos]=1;        for(j=1;j<=n;j++)        {            if(visit[j]==0&&low[j]>map[pos][j])                low[j]=map[pos][j];        }    }   if(result>=MAX)    printf("-1\n");  else    printf("%d\n",result);}int main(){    int t;    cin>>t;    while(t--)    {        int m,k;        scanf("%d%d%d",&n,&m,&k);        int a,b,c;        int i,number,number1,j,p;        for(i=1;i<=n;i++)        {            for(j=1;j<=n;j++)                map[i][j]=MAX;        }        while(m--)        {            scanf("%d%d%d",&a,&b,&c);            if(map[a][b]>c)//这个地方其实蛮关键的,刚开始就是因为这个地方不知道,才WA了9次            {              map[a][b]=c;              map[b][a]=c;            }        }        int b1[501];        for(i=1;i<=k;i++)        {            cin>>number1;            number=number1;            j=1;            while(number1--)            {                scanf("%d",&a);                b1[j]=a;                j++;            }            for(j=1;j<=number;j++)            {                for(p=j+1;p<=number;p++)                {                    map[b1[j]][b1[p]]=0;                    map[b1[p]][b1[j]]=0;                }            }        }       prim();    }    }


0 0
原创粉丝点击