POJ - 1258 Agri-Net ( prime
Farmer John has been elected mayor of his town! One of his campaign promises was to bring internet connectivity to all farms in the area. He needs your help, of course. Farmer John ordered a high speed connection for his farm and is going to share his connectivity with the other farmers. To minimize cost, he wants to lay the minimum amount of optical fiber to connect his farm to all the other farms. Given a list of how much fiber it takes to connect each pair of farms, you must find the minimum amount of fiber needed to connect them all together. Each farm must connect to some other farm such that a packet can flow from any one farm to any other farm. The distance between any two farms will not exceed 100,000.
Input
The input includes several cases. For each case, the first line contains the number of farms, N (3 <= N <= 100). The following lines contain the N x N conectivity matrix, where each element shows the distance from on farm to another. Logically, they are N lines of N space-separated integers. Physically, they are limited in length to 80 characters, so some lines continue onto others. Of course, the diagonal will be 0, since the distance from farm i to itself is not interesting for this problem.
Output
For each case, output a single integer length that is the sum of the minimum length of fiber required to connect the entire set of farms.
Sample Input
4
0 4 9 21
4 0 8 17
9 8 0 16
21 17 16 0
Sample Output
28
문제 풀이:
최소 생 성 트 리 의 판 자 는 예전 에는 크 루스 칼 알고리즘 으로 썼 는데 이번 에는 프 라 임 으로...
AC 코드
#include
#include
#include
using namespace std;
#define LL long long
#define CLR(a,b) memset(a,(b),sizeof(a))
const int INF = 0x3f3f3f3f;
const int N = 1e2+10;
int dis[N];
int G[N][N];
bool vis[N];
int n, m;
//void init()
//{
// for(int i = 1; i <= n; i++) {
// for(int j = 1; j <= n; j++) {
// if(i == j) G[i][j] = 0;
// else G[i][j] = INF;
// }
// }
//}
int prim(int s)
{
int ans = 0;
CLR(vis,false);
for(int i = 1; i <= n; i++) {
dis[i] = INF;
}
dis[s] = 0;
for(int i = 1; i <= n; i++) {
int minx = INF;
int next;
for(int j = 1; j <= n; j++) {
if(!vis[j] && dis[j]// if(minx == INF) break;
ans += minx;
vis[next] = true;
for(int j = 1; j <= n; j++) {
if(!vis[j] && dis[j]>G[next][j]) {
dis[j] = G[next][j];
}
}
}
return ans;
}
int main()
{
while(~scanf("%d",&n)) {
for(int i = 1;i <= n; i++) {
for(int j = 1; j <= n; j++) {
scanf("%d",&G[i][j]);
}
}
printf("%d
",prim(1));
}
return 0;
}
이 내용에 흥미가 있습니까?
현재 기사가 여러분의 문제를 해결하지 못하는 경우 AI 엔진은 머신러닝 분석(스마트 모델이 방금 만들어져 부정확한 경우가 있을 수 있음)을 통해 가장 유사한 기사를 추천합니다:
AZ-900을 자택 수험으로 무료 취득한 이야기 (2020/10)에서 2일간(오전중에만)의 온라인 트레이닝을 받는 것으로 무료 바우처를 받을 수 있다(등록 메일에 온다) 때문에, 부터 Peason VUE でスケジュール 버튼을 눌러, 화면에 따라 예약해 합격합시다 . ※2020/1...
텍스트를 자유롭게 공유하거나 복사할 수 있습니다.하지만 이 문서의 URL은 참조 URL로 남겨 두십시오.
CC BY-SA 2.5, CC BY-SA 3.0 및 CC BY-SA 4.0에 따라 라이센스가 부여됩니다.