道路建设 (Ver. I)

题目描述

有N个村庄,编号从1到N,你应该建造一些道路,使每个村庄都可以相互连接。

两个村A和B是相连的,当且仅当A和B之间有一条道路,或者存在一个村C使得在A和C之间有一条道路,并且C和B相连。

现在一些村庄之间已经有一些道路,你的任务就是修建一些道路,使所有村庄都连通起来,并且所有道路的长度总和是最小的。

输入

测试数据有多组

第一行是整数N(3 <= N <= 100),代表村庄的数量。 然后是N行,其中第i行包含N个整数,这些N个整数中的第j个是村庄i和村庄j之间的距离(距离是[1,1000]内的整数)。

然后是整数Q(0 <= Q <= N *(N + 1)/ 2),接下来是Q行,每行包含两个整数a和b(1 <= a <b <= N),代表着村庄a和村庄b之间的道路已经建成。

输出

对于每组测试数据

输出一个整数,表示要构建的道路的长度总和最小值

样例输入

3 0 990 692 990 0 179 692 179 0 1 1 2

样例输出

179

提示

#include<iostream>
#include<cstring>
using namespace std;
const int maxx=0x7f;
int array[maxx][maxx];
class Kru
{
public:
    int bef;
    int aft;
    int data;
    int flag;
    Kru()
    {
        bef=aft=-1;
        data=flag=0;
    }
};
int find(string str[],int n,string st)///返回st字符串的下标
{
    for(int i=0;i<n;i++)
    {
        if(str[i]==st)
            return i;
    }
    return -1;
}
 
void prim(string str[],int n,int start)
{
    int index=start;///开始遍历的顶点
    int sum=0;
    int visit[n];
    int dist[n];
    int pos[n];
    memset(visit,false,sizeof(visit));
    visit[index]=true;
    for(int i=0;i<n;i++)
    {
        dist[i]=array[index][i];
        pos[i]=index*100+i;///表示index与i连通
    }
    string bef[n];
    string aft[n];
    int quan[n];
    int r=0;
    for(int i=1;i<n;i++)
    {
        int minn=0x3f3f3f3f;
        for(int j=0;j<n;j++)
        {
            if(!visit[j]&&dist[j]<minn)
            {
                minn=dist[j];
                index=j;
            }
        }
        visit[index]=true;
        bef[r]=str[pos[index]/100];
        aft[r]=str[index];
        quan[r]=dist[index];
        r++;
        sum+=dist[index];
        for(int j=0;j<n;j++)
        {
            if(!visit[j]&&dist[j]>array[index][j])
            {
                dist[j]=array[index][j];
                pos[j]=index*100+j;
            }
        }
    }
    cout<<sum<<endl;
}
int main()
{
    int n;
    while(cin>>n)
    {
        string str[maxx];
        for(int i=0;i<n;i++)
        {
            for(int j=0;j<n;j++)
            {
                cin>>array[i][j];
            }
        }
        int Q;
        cin>>Q;
        for(int i=0;i<Q;i++)
        {
            int b,a;
            cin>>b>>a;
            array[b-1][a-1]=0;
            array[a-1][b-1]=0;
        }
        for(int i=0;i<n;i++)
        {
            char c='0'+i;
            str[i]+=c;
        }
        string s="0";
        int d=find(str,n,s);
        prim(str,n,d);
    }
    return 0;
}
上一篇:cmake自动添加git版本信息到生成代码


下一篇:跃锦成龙之表白流星