http://acm.hdu.edu.cn/showproblem.php?pid=3371用C++能過,G++過不了不過用prim能過

來源:互聯網
上載者:User
#include<cstdio>#include<algorithm>#include<string.h>#include<functional>#include<cmath>#include<iostream>using namespace std;class node{public:int u,v;int dist;}edge[55002];int num[509];int find(int x){return x==num[x]?x:num[x]=find(num[x]);}bool cmp(node xx,node yy){return xx.dist<yy.dist;}int main(){int t;scanf("%d",&t); while(t--)   {  int n,m,k; scanf("%d%d%d",&n,&m,&k);    for(int i=0;i<=508;i++)    {     num[i]=i;    }int a,b,x,mn=1,nn,nx,mx;for(int i=1;i<=m;i++){scanf("%d%d%d",&a,&b,&x);edge[i].u=a;edge[i].v=b;edge[i].dist=x;} while(k--) { int tt; int con[510]={0};   scanf("%d",&tt);   for(int i=0;i<tt;++i)   {    scanf("%d",&con[i]);     }   for(int i=1;i<tt;++i)   num[find(con[i])]=find(con[i-1]);//串連倖存的道路 } int xn=1; for(int i=1;i<=n;i++) for(int j=1;j<=n;j++)//xn為倖存的道路數 {    if(i==j)continue;if(num[j]==i)xn++; }sort(edge+1,edge+1+m,cmp);int sum=0;for(int i=1;xn<n&&i<=m;i++){int cx=find(edge[i].u),cy=find(edge[i].v);if(cx!=cy){num[cx]=cy;sum+=edge[i].dist;xn++;}}if(xn<n)//因為初始化為1所以如果能連通,xn==nsum=-1;printf("%d\n",sum);}return 0;} 

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.