题解 最小生成树 POJ 2395
题解:有N个农场和M条路,每条路距离为Li。求小女孩从农场1遍历遍历所有农场的最小边长。
做法:prim最小生成树
代码:
#include <iostream> #include <cstdio> #include <cstring> #define INF 999999999 using namespace std; const int MAX=3000; int v[MAX],a[MAX][MAX],dis[MAX]; int n,m; void prim() { v[1]=1; int i,len=0; for(i=1;i<=n;i++) { dis[i]=a[1][i]; } for(int k=1;k<n;k++) { int minn=INF; int point=0; for(i=1;i<=n;i++) { if((!v[i])&&dis[i]<minn) { minn=dis[i],point=i; } } len=max(len,minn); v[point]=1; dis[point]=INF; if(point!=0) { for(i=1;i<=n;i++) if(!v[i]&&dis[i]>a[point][i]) {dis[i]=a[point][i];} } } printf("%d\n",len); } int main() { int x,y,i,j,l; memset(v,0,sizeof(v)); scanf("%d%d",&n,&m); for(i=1;i<=n;i++) for(j=1;j<=n;j++) a[i][j]=INF; for(i=1;i<=m;i++) { scanf("%d%d%d",&x,&y,&l); a[x][y]=min(a[x][y],min(a[y][x],l)); a[y][x]=a[x][y]; } prim(); return 0; }
错误:WA 原因:未考虑重边的情况