poj 2395 prime的递归实现
题目链接:http://poj.org/problem?id=2395
求最小水桶的大小,每到达一个农村就能把水桶补满。
可见是用生成最小树,求最大边。
关于prime个人感觉用递归实现会少一个for的时间。
本题的坑:输入边的时候要找最小的,不然会出错。
1 #include<cstdio> 2 #include<cstring> 3 using namespace std; 4 const int inf=0x3f3f3f3f; 5 const int maxn=2006; 6 int n,m; 7 int mp[maxn][maxn]; 8 int dist[maxn]; 9 bool flag[maxn]; 10 int ans; 11 12 void prime2(int nex) 13 { 14 15 int mark=-1; 16 for(int j=1;j<=n;j++){ 17 if(!flag[j]){ 18 if(dist[j]>mp[nex][j]) 19 dist[j]=mp[nex][j]; 20 if(mark==-1) mark=j; 21 else if(dist[j]<dist[mark]) mark=j; 22 } 23 } 24 if(mark==-1) return ; 25 if(ans<dist[mark]) ans=dist[mark]; 26 flag[mark]=true; 27 prime2(mark); 28 } 29 30 int my_min(int a,int b){ return a<b?a:b;} 31 32 int main() 33 { 34 while( ~scanf("%d%d",&n,&m)){ 35 int x,y,z; 36 memset( mp, inf, sizeof mp); 37 for(int i=1;i<=m;i++){ 38 scanf("%d%d%d",&x,&y,&z); 39 mp[x][y]=my_min(mp[x][y],z); 40 mp[y][x]=mp[x][y]; 41 } 42 memset( flag, 0, sizeof flag); 43 for(int i=1;i<=n;i++) 44 dist[i]=mp[1][i]; 45 flag[1]=true; 46 ans=0; 47 prime2(1); 48 printf("%d\n",ans); 49 } 50 return 0; 51 }