zoj 2966

来源:互联网 发布:兰溪行知学院招租店面 编辑:程序博客网 时间:2024/04/29 09:31


最小生成树裸题



prim 算法:


#include<cstdio>#include<string.h>#include<math.h>#include<iostream>#include<algorithm>using namespace std;#define M 510#define inf 1000000int dis[M],map[M][M],vis[M];void prime(int n){  int i,j,sum=0,p,min;  memset(vis,0,sizeof(vis));  vis[0]=1;  for(i=1;i<n;i++)  {    dis[i]=map[0][i];  }  for(i=1;i<n;i++)  {     min=inf;p=-1; for(j=1;j<n;j++) if(vis[j]==0&&min>dis[j]) { min=dis[j];p=j; } sum+=min;vis[p]=1; for(j=0;j<n;j++)   if(vis[j]==0&&dis[j]>map[p][j])   dis[j]=map[p][j];  }  printf("%d\n",sum);}int main(){int t,i,j,n,m,a,b,c;scanf("%d",&t);while(t--){   scanf("%d%d",&n,&m);   for(i=0;i<n;i++)   for(j=0;j<n;j++)   map[i][j]=inf;   for(i=0;i<m;i++)   {   scanf("%d%d%d",&a,&b,&c);   if(map[a][b]>c)   map[a][b]=map[b][a]=c;   }   prime(n);}return  0;}


Kruskal 算法:


#include <stdio.h>#include <iostream>#include <algorithm>#include <string.h>#include <string>using namespace std;int father[1000 + 5];int n,m;int ans;struct Node {int from,to,value;}node[150000];void clear() {memset(node,0,sizeof(node));for(int i=0;i<1005;i++)father[i] = i;ans = 0;}int find(int x) {if(x != father[x])return find(father[x]);return x;}bool cmp(Node x,Node y) {return x.value < y.value;}void kruskal() {for(int i=0;i<m;i++) {int dx = find(node[i].from);int dy = find(node[i].to);if(dx != dy) {father[dy] = dx;ans += node[i].value;}}}int main() {int t;scanf("%d",&t);while(t--) {clear();scanf("%d %d",&n,&m);for(int i=0;i<m;i++) {scanf("%d %d %d",&node[i].from,&node[i].to,&node[i].value);if(node[i].value == 0)father[node[i].to] = node[i].from;}sort(node,node+m,cmp);kruskal();printf("%d\n",ans);}return 0;}


0 0
原创粉丝点击