hdu 3371 Connect the Cities 最小生成树prim

来源:互联网 发布:长沙开福网络花店 编辑:程序博客网 时间:2024/06/06 02:10

题目链接

题意:给出n个城市,m条路,k组互相还连通的城市,求使城市连通的最小的代价。

k组城市之间不需要两两距离赋为0,只需建立n-1条距离为0的路即可。

#include <iostream>#include<cstdio>#include<cstring>#include<cmath>#define N 550#define INF 0x7ffffffusing namespace std;int d[N],v[N],mp[N][N],n;int prim(){    for(int i=1;i<=n;i++)   d[i]=INF,v[i]=0;    d[1]=0;    for(int i=0;i<n;i++)    {        int mmin=INF,t=-1;        for(int j=1;j<=n;j++)            if(!v[j]&&d[j]<mmin)                mmin=d[t=j];        v[t]=1;        if(t==-1)   return -1;        for(int j=1;j<=n;j++)            if(!v[j])                d[j]=min(d[j],mp[t][j]);    }    int ans=0;    for(int i=1;i<=n;i++)   ans+=d[i];    return ans;}int main(){    int T,m,k;    cin>>T;    while(T--)    {        cin>>n>>m>>k;        for(int i=1;i<=n;i++)            for(int j=1;j<=n;j++)                mp[i][j]=INF;        for(int i=0;i<m;i++)        {            int u,v,w;            scanf("%d%d%d",&u,&v,&w);            if(mp[u][v]>w)  mp[u][v]=mp[v][u]=w;        }        for(int i=0;i<k;i++)        {            int t,u,v;            scanf("%d",&t);            for(int j=0;j<t;j++)            {                scanf("%d",&u);                if(j)   mp[u][v]=mp[v][u]=0;                v=u;            }        }        cout<<prim()<<endl;    }}

0 0
原创粉丝点击