POJ 1287 Networking (ZOJ 1372) MST
http://acm.zju.edu.cn/onlinejudge/showProblem.do?problemId=372
지난번 그 문제 와 차이 가 많 지 않다.
오 랜 만 에 연락 하 는 펜팔 과 이 야 기 를 나 누 면서 두 드 립 니 다 ~ 하하 하, 한번 AC, 물.
Kruskal
#include<cstdio>
#include<algorithm>
using namespace std;
const int N=55;
const int MAXN=3000;
int n,sum;
int fa[N];
struct dot
{
int x,y;
int len;
}data[MAXN];
bool operator < (const dot & a,const dot &b)
{
return a.len<b.len;
}
int find(int cur)
{
return cur==fa[cur]? cur: fa[cur]= find(fa[cur]);
}
int main()
{
while(scanf("%d",&n),n)
{
int num;
scanf("%d",&num);
for(int i=0;i<num;i++)
{
scanf("%d%d%d",&data[i].x,&data[i].y,&data[i].len);
}
sort(data,data+num);
for(int i=0;i<=n;i++)
fa[i]=i;
sum=0;
for(int i=0;i<num;i++)
{
int root_x=find(data[i].x);
int root_y=find(data[i].y);
if(root_x!=root_y)
{
sum+=data[i].len;
fa[root_x]=root_y;
}
}
printf("%d
",sum);
}
return 0;
}
12 / 7 Prim 알고리즘 업데이트
씻 고 자.
#include<cstdio>
#include<algorithm>
using namespace std;
const int MAXN=55;
const int INF=999999;
int dis[MAXN],map[MAXN][MAXN];
int sum;
int n,num;
void prim()
{
bool vis[MAXN]={0};
for(int i=1;i<=n;i++)
dis[i]=INF;
int cur=1;
vis[cur]=1;
dis[cur]=0;
for(int i=1;i<=n;i++)
{
int mini=INF;
for(int j=1;j<=n;j++)
if(!vis[j] && dis[j] > map[cur][j])//
dis[j]=map[cur][j];
for(int j=1;j<=n;j++)
if(!vis[j] && mini> dis[j])
mini=dis[cur=j];
vis[cur]=1;
}
}
int main()
{
while(scanf("%d",&n),n)
{
for(int i=0;i<MAXN;i++)
for(int j=0;j<MAXN;j++)
map[i][j]=INF;
scanf("%d",&num);
for(int i=0;i<num;i++)
{
int x,y,len;
scanf("%d%d%d",&x,&y,&len);
if(map[x][y] > len)
map[y][x]=map[x][y]=len;
}
sum=0;
prim();
for(int i=1;i<=n;i++)
sum+=dis[i];
printf("%d
",sum);
}
return 0;
}
이 내용에 흥미가 있습니까?
현재 기사가 여러분의 문제를 해결하지 못하는 경우 AI 엔진은 머신러닝 분석(스마트 모델이 방금 만들어져 부정확한 경우가 있을 수 있음)을 통해 가장 유사한 기사를 추천합니다:
정수 반전Udemy 에서 공부 한 것을 중얼거린다 Chapter3【Integer Reversal】 (예) 문자열로 숫자를 반전 (toString, split, reverse, join) 인수의 수치 (n)가 0보다 위 또는 ...
텍스트를 자유롭게 공유하거나 복사할 수 있습니다.하지만 이 문서의 URL은 참조 URL로 남겨 두십시오.
CC BY-SA 2.5, CC BY-SA 3.0 및 CC BY-SA 4.0에 따라 라이센스가 부여됩니다.