最小生成树之prim算法
prim算法理论基于MST性质,实现过程如下图所示:
附上HDU1233 AC CODE:
#include <algorithm> #include <functional> #include <list> #define MAX 101 using namespace std; int n,a,b,c; int map[MAX][MAX]; list<int> v,u; int main() { while(scanf("%d",&n)!=EOF && n!=0) { memset(map,0,sizeof(map)); v.clear(); u.clear(); for(int i=0;i<(n*(n-1)/2);i++) { scanf("%d%d%d",&a,&b,&c); map[a][b]=map[b][a]=c; } for(int i=1;i<=n;i++) { v.push_back(i); } u.push_back(*v.begin()); v.erase(v.begin()); int sum=0; while(v.size()) { int min=1<<30; list<int>::iterator viter,uiter,vi,ui; for(vi=v.begin();vi!=v.end();vi++) { for(ui=u.begin();ui!=u.end();ui++) { if(map[*vi][*ui]<min) { min=map[*vi][*ui]; viter=vi; uiter=ui; } } } sum+=min; u.push_back(*viter); v.erase(viter); } printf("%d\n",sum); } return 0; }
HDU1879
#include <algorithm> #include <functional> #include <list> #define MAX 101 using namespace std; int n; int val[MAX][MAX]; bool has[MAX][MAX]; list<int> v,s; int main() { while(scanf("%d",&n)!=EOF && n!=0) { memset(val,0,sizeof(val)); memset(has,false,sizeof(has)); v.clear(); s.clear(); for(int i=0;i<(n*(n-1)/2);i++) { int a,b,c,d; scanf("%d%d%d%d",&a,&b,&c,&d); val[a][b]=val[b][a]=c; has[a][b]=has[b][a]=(d==1?true:false); } for(int i=1;i<=n;i++) { v.push_back(i); } s.push_back(v.front()); v.pop_front(); int sum=0; while(v.size()) { list<int>::iterator viter,vi,si; int m=1<<30; for(vi=v.begin();vi!=v.end();vi++) { for(si=s.begin();si!=s.end();si++) { if(val[*vi][*si] && val[*vi][*si]<=m || has[*vi][*si]) { if(has[*vi][*si]) { m=0; } else { m=val[*vi][*si]; } //printf("%d->%d:%d\n",*vi,*si,m); viter=vi; } } } sum+=m; s.push_back(*viter); v.erase(viter); } printf("%d\n",sum); } return 0; }