标签:超时 others stand tracking note memory most integer font
1 6 4 3 1 4 2 2 6 1 2 3 5 3 4 33 2 1 2 2 1 3 3 4 5 6
1
难理解的就是最后那k行。開始的数字t表示有几个城市。然后输入t个城市,表示第一个城市和第二个连接,第二个和第三个连接。
。。
用kruskal算法超时的多提交两次。
。当然也能够用pri算法。。
不想写。。
#include <stdio.h> #include <string.h> #include <algorithm> using namespace std; struct node { int a,b,cost; }c[30000]; int fa[505]; void init(int n) { for(int i=1;i<=n;i++) fa[i]=i; } bool cmp(node x,node y) { return x.cost<y.cost; } int find(int x) { if(fa[x]!=x) fa[x]=find(fa[x]); return fa[x]; } int main() { int n,k,m,ncase; scanf("%d",&ncase); while(ncase--) { scanf("%d %d %d",&n,&k,&m); init(n); for(int i=0;i<k;i++) scanf("%d %d %d",&c[i].a,&c[i].b,&c[i].cost); for(int i=1;i<=m;i++) { int x,pos,pos1; scanf("%d %d",&x,&pos); for(int j=1;j<x;j++) { scanf("%d",&pos1); c[k].a=pos,c[k].b=pos1,c[k].cost=0; pos=pos1; k++; } } sort(c,c+k,cmp); int sum=0; for(int i=0;i<k;i++) { int x=find(c[i].a); int y=find(c[i].b); if(x!=y) sum+=c[i].cost,fa[x]=y; } int count=0; for(int i=1;i<=n;i++) if(fa[i]==i) count++; if(count!=1) printf("-1\n"); else printf("%d\n",sum); } return 0; }
hdu3371 Connect the Cities (MST)
标签:超时 others stand tracking note memory most integer font
原文地址:http://www.cnblogs.com/lytwajue/p/6941535.html