日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當(dāng)前位置: 首頁 > 编程资源 > 编程问答 >内容正文

编程问答

HDU2724 Tree【最小生成树】

發(fā)布時(shí)間:2025/6/15 编程问答 30 豆豆
生活随笔 收集整理的這篇文章主要介紹了 HDU2724 Tree【最小生成树】 小編覺得挺不錯(cuò)的,現(xiàn)在分享給大家,幫大家做個(gè)參考.

題目大意:

有N個(gè)城市,每個(gè)城市有一個(gè)幸福值,如果兩個(gè)城市A、B的幸福值分別為VA、VB,如果VA是

數(shù),或者VB是素?cái)?shù),又或者VA+VB是素?cái)?shù),則城市A和B就能連接一條路,建路的所用花費(fèi)

Min(Min(VA , VB),|VA-VB|)。

問:現(xiàn)在想要建幾條路,使得能夠連接所有的城市,所需要建設(shè)的最少路程和是多少?


思路:

就是求最小生成樹,先用素?cái)?shù)篩選法將素?cái)?shù)打表,然后根據(jù)題意建邊。最后就是用Prim模板求

最小生成樹就行了。


AC代碼:

[cpp]?view plaincopy
  • #include<iostream>??
  • #include<algorithm>??
  • #include<cstdio>??
  • #include<cstring>??
  • using?namespace?std;??
  • const?int?MAXN?=?660;??
  • const?int?INF?=?0xffffff0;??
  • ??
  • int?vis[MAXN],low[MAXN],Map[MAXN][MAXN],A[MAXN];??
  • int?prim(int?n)??
  • {??
  • ????int?pos,Min,result?=?0;??
  • ????memset(vis,0,sizeof(vis));??
  • ??
  • ????vis[1]?=?1;??
  • ????pos?=?1;??
  • ??
  • ????for(int?i?=?1;?i?<=?n;?i++)??
  • ????????if(i?!=?pos)??
  • ????????????low[i]?=?Map[pos][i];??
  • ??
  • ????for(int?i?=?1;?i?<?n;?i++)??
  • ????{??
  • ????????Min?=?INF;??
  • ????????for(int?j?=?1;?j?<=?n;?j++)??
  • ????????{??
  • ????????????if(vis[j]==0?&&?Min?>?low[j])??
  • ????????????{??
  • ????????????????Min?=?low[j];??
  • ????????????????pos?=?j;??
  • ????????????}??
  • ????????}??
  • ??
  • ????????result?+=?Min;??
  • ????????vis[pos]?=?1;??
  • ??
  • ????????for(int?j?=?1;?j?<=?n;?j++)??
  • ????????{??
  • ????????????if(vis[j]==0?&&?low[j]?>?Map[pos][j])??
  • ????????????{??
  • ????????????????low[j]?=?Map[pos][j];??
  • ????????????}??
  • ????????}??
  • ????}??
  • ??
  • ????return?result;??
  • }??
  • ??
  • bool?Prime[1000100];??
  • ??
  • void?IsPrime()??
  • {??
  • ????for(int?i?=?2;?i?<=?1000000;?++i)??
  • ????????Prime[i]?=?true;??
  • ????for(int?i?=?2;?i?<=?1000000;?++i)??
  • ????{??
  • ????????if(Prime[i])??
  • ????????{??
  • ????????????for(int?j?=?i+i;?j?<=?1000000;?j?+=?i)??
  • ????????????????Prime[j]?=?false;??
  • ????????}??
  • ????}??
  • }??
  • ??
  • int?father[MAXN];??
  • ??
  • int?find(int?x)??
  • {??
  • ????if(x?==?father[x])??
  • ????????return?father[x];??
  • ????else??
  • ????????return?father[x]?=?find(father[x]);??
  • }??
  • ??
  • int?main()??
  • {??
  • ????int?T,N;??
  • ????scanf("%d",&T);??
  • ????IsPrime();??
  • ????while(T--)??
  • ????{??
  • ????????scanf("%d",&N);??
  • ????????for(int?i?=?1;?i?<=?N;?++i)??
  • ????????????for(int?j?=?1;?j?<=?N;?++j)??
  • ????????????????Map[i][j]?=?INF;??
  • ????????for(int?i?=?1;?i?<=?N;?++i)??
  • ????????????scanf("%d",&A[i]);??
  • ??
  • ????????for(int?i?=?1;?i?<=?N;?++i)??
  • ????????????father[i]?=?i;??
  • ??
  • ????????for(int?i?=?1;?i?<=?N;?++i)??
  • ????????{??
  • ????????????for(int?j?=?i+1;?j?<=?N;?++j)??
  • ????????????{??
  • ????????????????if(Prime[A[i]]?||?Prime[A[j]]?||?Prime[A[i]+A[j]])??
  • ????????????????{??
  • ????????????????????int?x?=?find(i);??
  • ????????????????????int?y?=?find(j);??
  • ????????????????????if(x?!=?y)??
  • ????????????????????????father[x]?=?y;??
  • ????????????????????Map[i][j]?=?Map[j][i]?=?min(min(A[i],A[j]),abs(A[i]-A[j]));??
  • ????????????????}??
  • ????????????}??
  • ????????}??
  • ????????int?flag?=?1;??
  • ????????for(int?i?=?1;?i?<=?N;?++i)??
  • ????????{??
  • ????????????if(find(i)?!=?find(1))??
  • ????????????????flag?=?0;??
  • ????????}??
  • ????????if(flag)??
  • ????????????printf("%d\n",prim(N));??
  • ????????else??
  • ????????????printf("-1\n");??
  • ????}??
  • ??
  • ????return?0;??
  • } ?
  • 總結(jié)

    以上是生活随笔為你收集整理的HDU2724 Tree【最小生成树】的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。

    如果覺得生活随笔網(wǎng)站內(nèi)容還不錯(cuò),歡迎將生活随笔推薦給好友。