点击打开链接
解析:并查集,kruskal算法
代码:
#include <cstdio> #include <algorithm> using namespace std; int par[2000]; int n,m,num; struct node { int st,endd,cost; }p[2000]; int find(int x) // 查找 { // return par[x]==x?par[x]:find(par[x]); int q=x; while(x!=par[x]) x=par[x]; while(par[q]!=x) { int j=par[q]; par[q]=x; q=j; } return par[x]; } bool cmp(node a, node b) //两两道路间的成本排序 { return a.cost<b.cost; } void kruskal() { int money=0,i; for(i=1;i<=m;i++) par[i]=i; sort(p+1,p+n+1,cmp); for(i=1;i<=n;i++) //不是同一个父亲节点则合并 { int fx=find(p[i].st); int fy=find(p[i].endd); if(fx!=fy) { num++; money+=p[i].cost; par[fx]=fy; } } if(num==m-1) //m-1 -> m个村庄之间的最少的路 printf("%d\n",money); else printf("?\n"); } int main() { while(scanf("%d%d",&n,&m)!=EOF&&n) { // scanf("%d",&m); num=0; for(int i=1;i<=n;i++) scanf("%d%d%d",&p[i].st,&p[i].endd,&p[i].cost); kruskal(); } return 0; }