链接 : http://acm.hdu.edu.cn/showproblem.php?pid=1863
依然最小生成树,这次是加了不能连通的判断,Prim和Kruskal,均0ms
把自己毒了,Prim的时候交换权值的时候写反了,一直WA
Prim:
#include <cstdio> #include <climits> #include <cstring> using namespace std; bool used[101]; int map[101][101]; int Prim(int n) { int mini,t,T=n-1,sum=0; while(T--) { mini=INT_MAX; for(int i=2; i<=n; i++) if(!used[i] && mini>map[1][i]) { mini=map[1][i]; t=i; } if(mini==INT_MAX) return -1; //判通路 used[t]=1; sum+=mini; for(int i=2; i<=n; i++) if(!used[i] && map[t][i]<map[1][i]) map[1][i]=map[t][i]; //就是这里手抖写反了T T } return sum; } int main() { int n,m; while(~scanf("%d %d",&n,&m),n) { for(int i=0;i<=101;i++) for(int j=0;j<=101;j++) map[i][j]=INT_MAX; memset(used,0,sizeof(used)); while(n--) { int i,j,dis; scanf("%d %d %d",&i,&j,&dis); if(map[i][j]>dis) map[i][j]=map[j][i]=dis; //可以不考虑重边 } int ans=Prim(m); printf(ans==-1 ? "?\n" : "%d\n",ans); } return 0; }
#include <cstdio> #include <algorithm> using namespace std; struct node { int b,e,dis; }s[5001]; int father[101]; bool cmp(node a,node b) { return a.dis<b.dis; } int find(int n) { return n==father[n] ? n : father[n]=find(father[n]); } int main() { int n,m; while(~scanf("%d %d",&n,&m),n) { for(int i=0;i<=m;i++) father[i]=i; for(int i=0;i<n;i++) scanf("%d %d %d",&s[i].b,&s[i].e,&s[i].dis); sort(s,s+n,cmp); int sum=0; for(int i=0;i<n;i++) { int x=find(s[i].b); int y=find(s[i].e); if(x!=y) { m--; //判通路 father[y]=x; sum+=s[i].dis; } } printf(m>1 ? "?\n" : "%d\n",sum); } return 0; }