hdu4460

1466 단어
링크:클릭하여 링크 열기
제목: 연결된 변을 주고 모든 변을 연결하는 가장 짧은 거리를 구하십시오
코드:
#include <iostream>
#include<cstdio>
#include<cstring>
#include<algorithm>
#include<cmath>
#define maxx 99999999;
double dis[200],a[200][200];
int sign[200],x[200],y[200],n,st,en;
double sum=0;
void prim(int v){
    int i,j,u;
    double temp;
    for(i=1;i<=n;i++){
        dis[i]=a[v][i];
        sign[i]=0;
    }
    dis[v]=0;sign[v]=1;
    for(i=2;i<=n;i++){
        temp=maxx;
        u=v;
        for(j=1;j<=n;j++)
        if(dis[j]<temp&&sign[j]==0){
            temp=dis[j];
            u=j;
        }
        sum+=temp;
        sign[u]=1;
        for(j=1;j<=n;j++){
        if(a[u][j]<dis[j]&&sign[j]==0)
        dis[j]=a[u][j];
        }
    }
}
using namespace std;
int main(){
    int i,j;
    while(cin>>n&&n){
        cin>>st>>en;
        for(i=1;i<200;i++)
        for(j=1;j<200;j++)
        a[i][j]=maxx;
        for(i=1;i<=n;i++)
        cin>>x[i]>>y[i];
        for(i=1;i<=n;i++)
        for(j=1;j<=n;j++)
        a[i][j]=a[j][i]=sqrt((x[i]-x[j])*(x[i]-x[j])+(y[i]-y[j])*(y[i]-y[j]));
        sum=sqrt((x[st]-x[en])*(x[st]-x[en])+(y[st]-y[en])*(y[st]-y[en]));
        a[st][en]=a[en][st]=0;           //              0,  prim        
        prim(1);
        printf("%.2lf
",sum); } return 0; }

 

좋은 웹페이지 즐겨찾기