POJ 1797(最大生成树prim)

本文介绍了一种使用Prim算法求解最小生成树的方法,通过详细的代码实现展示了如何从一组顶点中选择边来构建一棵权值最小的树,适用于解决网络设计、电路布线等问题。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

mmp,到n就行,不用每个点都到,wa到哭泣

 1 #include <iostream>
 2 #include <cstdio>
 3 #include <cmath>
 4 #include <cstring>
 5 #include <algorithm>
 6 #include <queue>
 7 #include <stack>
 8 #include <vector>
 9 #include <iomanip>
10 using namespace std;
11 int map[1010][1010],n,m,d[1010],vis[1010];
12 int prim()
13 {
14         d[1]=0;
15         int ans=1e9;
16         for(int i=1;i<=n;i++)
17             d[i]=map[1][i];
18         vis[1]=1;
19         int end=1;
20         for(int i=1;i<=n;i++)
21         {
22             int mmin=-1e8;
23             for(int j=1;j<=n;j++)
24             {
25                 if(!vis[j]&&d[j]>mmin)
26                 {
27                     end=j;
28                     mmin=d[j];
29                 }    
30             }
31             ans=min(ans,mmin);
32             if(end==n)
33             break;;
34             vis[end]=1;
35             for(int j=1;j<=n;j++)
36             {
37                 if(!vis[j]&&d[j]<map[end][j])
38                 d[j]=map[end][j];
39             }
40         }
41         return ans;
42 }
43 int main(int argc, char *argv[])
44 {
45     int t,cout=0;
46     scanf("%d",&t);
47     while(t--)
48     {
49         cout++;
50         scanf("%d%d",&n,&m);
51         memset(vis,0,sizeof(vis));
52         for(int i=0;i<=n;i++)
53             for(int j=0;j<=n;j++)
54                 if(i==j)
55                 map[i][j]=0;
56                 else
57                 map[i][j]=-1e8;
58         for(int i=0;i<m;i++)
59         {
60             int x,y,z;
61             scanf("%d%d%d",&x,&y,&z);
62             if(map[x][y]<z)
63             map[x][y]=map[y][x]=z;
64         }
65         
66         printf("Scenario #%d:\n%d\n\n",cout,prim());
67     }
68     
69     return 0;
70 }

 

转载于:https://www.cnblogs.com/huluxin/p/9799948.html

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值