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 }

猜你喜欢

转载自www.cnblogs.com/ZQUACM-875180305/p/9328772.html