题目链接:http://acm.split.hdu.edu.cn/showproblem.php?pid=1863
思路:最小生成树模板题,直接套模板。
代码:
#include<iostream> #include<cstdio> #include<algorithm> #include<cstring> using namespace std; #define INF 1<<29 int mp[105][105]; int v[105],d[105]; int main() { int n,m; while(scanf("%d%d",&m,&n)==2 && m) { for(int i=1; i<=n; i++) for(int j=1; j<=n; j++) if(i==j) mp[i][j]=0; else mp[i][j]=INF; memset(v,0,sizeof(v)); int a,b,c; for(int i=1; i<=m; i++) { scanf("%d%d%d",&a,&b,&c); mp[a][b]=c; mp[b][a]=c; } for(int i=1; i<=n; i++) d[i]=mp[1][i]; int p; for(int i=1; i<=n; i++) { int mi=INF; for(int j=1; j<=n; j++) { if(!v[j] && d[j]<mi) mi=d[j],p=j; } v[p]=1; for(int j=1; j<=n; j++) { if(!v[j] && mp[p][j]<d[j]) d[j]=mp[p][j]; } } for(int i=1; i<=n; i++) d[1]+=d[i]; if(d[1]>=INF) puts("?"); else printf("%d\n",d[1]); } }