ZOJ 1586&&FZU 1096 QS Network(kuangbin带你飞 专题六 最小生成树)

来源:互联网 发布:animate淘宝旗舰店 编辑:程序博客网 时间:2024/05/16 18:33

这个题...好水,不过多了一个顶点的权值,所以建立某条边的话费就是边的花费+;两个顶点的花费...

这种各种找简单题做也不是办法...专题一还剩一道题...明天尽力给A掉...一直没看懂来着..好好努力...寒假眼看就剩一个月了 

#include<cstdio>#include<cstring>#include<cstdlib>#include<cmath>#include<iostream>#include<algorithm>using namespace std;int n,map[1023][1023],f[1023],p[1023];struct node{    int x,y,s;}s[600000];int cmp(node a,node b){    return a.s<b.s;}void inti(){    for(int i=0;i<=n;i++)        f[i]=i;}int find(int x){    if(x!=f[x])        return f[x]=find(f[x]);    return x;}int main(){    int T;    cin>>T;    while(T--)    {        cin>>n;        inti();        for(int i=1;i<=n;i++)            cin>>p[i];        for(int i=1;i<=n;i++)        {            for(int j=1;j<=n;j++)                scanf("%d",&map[i][j]);        }        int k=0;        for(int i=1;i<=n;i++)        {            for(int j=i+1;j<=n;j++)            {                s[k].x=i,s[k].y=j,s[k].s=p[i]+p[j]+map[i][j];                k++;            }        }        sort(s,s+k,cmp);        int ans=0,t=0;        for(int i=0;i<k;i++)        {            int x=find(s[i].x);            int y=find(s[i].y);            if(x!=y)            {                f[x]=y;                t++;                ans+=s[i].s;            }            if(t==n-1)                break;        }        cout<<ans<<endl;    }    return 0;}


0 0
原创粉丝点击