5-10 公路村村通 (30分)

5-10 公路村村通 (30分)

现有村落间道路的统计数据表中,列出了有可能建设成标准公路的若干条道路的成本,求使每个村落都有公路连通所需要的最低成本。
输入格式:

输入数据包括城镇数目正整数N 1000 和候选道路数目M( 3N );随后的M行对应MMM条道路,每行给出3个正整数,分别是该条道路直接连通的两个城镇的编号以及该道路改建的预算成本。为简单起见,城镇从1到N编号。
输出格式:

输出村村通需要的最低成本。如果输入数据不足以保证畅通,则输出−1,表示需要建设更多公路。
输入样例:

6 15
1 2 5
1 3 3
1 4 7
1 5 4
1 6 2
2 3 4
2 4 6
2 5 2
2 6 6
3 4 6
3 5 1
3 6 1
4 5 10
4 6 8
5 6 3

输出样例:

12

思路
关键词:最小生成树

点击访问 PTA-测验

#include
#include

/* 评测结果 
时间  结果  得分  题目  编译器     用时(ms)  内存(MB)  用户
2016-08-28 07:05    答案正确    30  5-10    gcc     43  5   569985011
测试点结果 
测试点     结果  得分/满分   用时(ms)  内存(MB)
测试点1    答案正确    15/15   2   1
测试点2    答案正确    2/2     2   1
测试点3    答案正确    2/2     1   1
测试点4    答案正确    5/5     43  5
测试点5    答案正确    6/6     24  5
查看代码

*/
struct data {
    int VerNode,Coast;
};
typedef struct LNode* Vertex;
struct LNode {
    struct data a[1001];
    int Left,Right;
};
void InsertV(Vertex,int ,int,int);
int Prim(Vertex ,int );
Vertex CreatV(int);
int Comp(const void*a,const void*b) {
    struct data x=*(struct data *)a;
    struct data y=*(struct data *)b;
    return x.Coast - y.Coast ;
}

int main() {
    int N,M;
    scanf("%d%d",&N,&M);
    Vertex V=CreatV(N+1);

    int from,to,lenth;
    for(int i=0; i"%d%d%d",&from,&to,&lenth);
        InsertV(V,from,to,lenth);
    }
    for(int i=1; i<=N; i++) {
        qsort(V[i].a,V[i].Right-V[i].Left,sizeof(struct data),Comp);
//      printf("%d",i);
//      for(int j=V[i].Left;j
//          printf("{-%d=%d}",V[i].a[j].VerNode,V[i].a[j].Coast  );
//      }printf("\n");
    }

    printf("%d",Prim(V,N));










    return 0;
}

int Prim(Vertex V,int N) {
    int right=0,left=0,Node[1001],Coast=0;
    for(int i=1; i<=N; i++) {
        if(V[i].Right >V[i].Left) {
            if(right) {
                if(V[i].a[0].Coast 0]].a[0].Coast) {
                    Node[0]=i;
                }
            } else {
                Node[right++]=i;
            }

        }
    }
    Coast+=V[Node[0]].a[0].Coast ; 
    Node[right++]=V[Node[0]].a[0].VerNode;
    V[Node[0]].Left ++;
//  printf("-%d-",right);
    while(rightint flag=-1;
        for(int i=0; iif(V[Node[i]].Leftif(flag!=-1) {
                    if(V[Node[i]].a[V[Node[i]].Left].Coast else {
                    flag=i;
                }
            }
        }
        if(-1==flag)break;
        int i;
        for(i=0;iif(V[Node[flag]].a[V[Node[flag]].Left].VerNode==Node[i])break;
        }
        if(i==right){
            Node[right++]=V[Node[flag]].a[V[Node[flag]].Left].VerNode;
            Coast+=V[Node[flag]].a[V[Node[flag]].Left].Coast ;
        }
        V[Node[flag]].Left++;
    }
    for(int i=0;i//      printf("[%d]",Node[i]);
    }
if(right>=N)return Coast;
    else return -1;
}

Vertex CreatV(int num) {
    Vertex V=(Vertex)malloc(sizeof(struct LNode)*num);
    for(int i=0; i0;
        V[i].Right =0;
    }

    return V;
}
void InsertV(Vertex V,int from,int to,int lenth) {
    V[from].a[V[from].Right].Coast =lenth;
    V[from].a[V[from].Right++].VerNode =to;
    V[to].a[V[to].Right].Coast =lenth;
    V[to].a[V[to].Right++].VerNode =from;
}

你可能感兴趣的:(PTA)