prim 最小生成树
hdu 1102
题意:已知N点间的距离,若有M条路已建(a,b之间是通路),求还需建多长的路,输出路的最小值。
对于M条路已建(a,b之间是通路)这一条件,只需令f[a][b] = f[b][a] = 0;
解决掉这个问题,就按prim 模板即可。

1 #include<stdio.h> 2 #include<string.h> 3 #define INf 0x7ffffff 4 int n,m; 5 int f[105][105],vis[105],dis[105]; 6 int prim() 7 { 8 int i,j,k,t,r; 9 for(i = 1;i <= n;i ++) 10 { 11 dis[i] = INf; 12 } 13 dis[1] =0; 14 for(i = 1;i <= n;i ++) 15 { 16 t = INf; 17 for(j = 1;j <= n;j ++) 18 { 19 if(!vis[j] && dis[j]<t) 20 { 21 t = dis[j]; 22 k = j; 23 } 24 } 25 vis[k] = 1; 26 for(j = 1;j <= n;j ++) 27 { 28 if(dis[j] > f[k][j] && !vis[j]) 29 dis[j] = f[k][j]; 30 } 31 } 32 r = 0; 33 for(i = 1;i <= n;i ++) 34 { 35 r += dis[i]; 36 } 37 return r; 38 } 39 int main() 40 { 41 int i,j,k,a,b; 42 while(~scanf("%d",&n)) 43 { 44 memset(vis,0,sizeof(vis)); 45 46 for(i = 1;i <= n;i ++) 47 { 48 for(j = 1;j <= n;j ++) 49 { 50 scanf("%d",&f[i][j]); 51 } 52 } 53 scanf("%d",&m); 54 while(m --) 55 { 56 scanf("%d %d",&a,&b); 57 f[a][b] = 0; 58 f[b][a] = 0; 59 } 60 k = prim(); 61 printf("%d\n",k); 62 } 63 return 0; 64 }
【推荐】还在用 ECharts 开发大屏?试试这款永久免费的开源 BI 工具!
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步