HDU1863
注意Kruscal算法本身是个贪心,得到的是最小生成森林,因此最后看所有顶点是不是有相同的祖先即可,如果不是,输出"?"。
1 #include<iostream> 2 #include<algorithm> 3 using namespace std; 4 struct node{ 5 int from,to,w; 6 bool operator < (const node &a){ 7 return w<a.w; 8 } 9 }a[10010]; 10 int n,m,f[101],ans,flag; 11 12 void ini(){ 13 ans=0; 14 flag=1; 15 for (int i=1;i<=n;i++) f[i]=i; 16 } 17 18 int getf(int u){ 19 return u==f[u]?f[u]:f[u]=getf(f[u]); 20 } 21 22 void merge(int u,int v){ 23 f[getf(u)]=getf(v); 24 } 25 26 void solve() 27 { 28 while (cin>>m){ 29 if (m==0) break; 30 cin>>n; 31 ini(); 32 for (int i=1;i<=m;i++) cin>>a[i].from>>a[i].to>>a[i].w; 33 sort(a+1,a+1+m); 34 for (int i=1;i<=m;i++){ 35 if (getf(a[i].from)!=getf(a[i].to)){ 36 ans+=a[i].w; 37 merge(a[i].from,a[i].to); 38 } 39 } 40 for (int i=1;i<=n && flag;i++){ 41 if (getf(i)!=getf(1)) flag=0; 42 } 43 if (flag) cout<<ans<<endl; 44 else cout<<"?"<<endl; 45 } 46 } 47 48 int main() 49 { 50 solve(); 51 return 0; 52 }

浙公网安备 33010602011771号