您的位置:首页 > 其它

Problem4-1001

2016-06-23 20:50 295 查看
简单题意:给你一些城镇,以及各个镇之间的距离,现在要修建道路,把这些镇子穿起来,已知一些镇子之间已经有了道路,现在求施工的最短路径。

解题思路:这是最小生成树问题,我采用的是kruskal算法。

代码如下:

 #include<iostream>

#include<cstdio>

#include<cstring>

using namespace std;

const int N=110;

const int INF=0x3f3f3f3f;

int n,ans;

int map

,dis
,vis
;

void Prim(){

    int i;

    for(i=1;i<=n;i++){

        dis[i]=map[1][i];

        vis[i]=0;

    }

    dis[1]=0;

    vis[1]=1;

    int j,k,tmp;

    for(i=1;i<=n;i++){

        tmp=INF;

        for(j=1;j<=n;j++)

            if(!vis[j] && tmp>dis[j]){

                k=j;

                tmp=dis[j];

            }

        if(tmp==INF)

            break;

        vis[k]=1;

        ans+=dis[k];

        for(j=1;j<=n;j++)

            if(!vis[j] && dis[j]>map[k][j])

                dis[j]=map[k][j];

    }

}

int main(){

    //freopen("input.txt","r",stdin);

    while(~scanf("%d",&n)){

        for(int i=1;i<=n;i++)

            for(int j=1;j<=n;j++)

                scanf("%d",&map[i][j]);

        int q,a,b;

        scanf("%d",&q);

        while(q--){

            scanf("%d%d",&a,&b);

            map[a][b]=map[b][a]=0;

        }

        ans=0;

        Prim();

        printf("%d\n",ans);

    }

    return 0;

}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: