B - 畅通工程 本来以为是最短路问题,做了好久,转换思路到幷查集。比原来多了最优方案选择的问题,只需要进行排序,然后进行正常幷查集操作即可,不用担心重复问题,因为幷查集不会出现这个问题,自动去重。 #include<bits/stdc++.h> using namespace std; typedef long long ll; #define INF 0x3f3f3f3f #define Max int(1e5+10) int fa[110],n,m; typedef struct e { int where,to,cost; }; bool cmp(e x,e y) { return x.cost<y.cost; } e g[Max]; int find(int x) { return fa[x]==x?x:fa[x]=find(fa[x]); } int main() { while(~scanf("%d%d%",&n,&m)&&n) { for(int i=1;i<=m;i++) fa[i]=i; for(int i=0;i<n;i++) scanf("%d%d%d",&g[i].where,&g[i].to,&g[i].cost); sort(g,g+n,cmp); int sum=0; for(int i=0;i<n;i++) { int x= find(g[i].where),y=find(g[i].to); if(x!=y) { fa[x]=y; sum+=g[i].cost; } } int count =0; for(int i=1;i<=m;i++) if(fa[i]==i) count++; if(count==1) printf("%d\n",sum); else printf("?\n"); } return 0; }