Hdu 3371 Connect the Cities(最小生成树)

地址:http://acm.hdu.edu.cn/showproblem.php?pid=3371

其实就是最小生成树,但是这其中有值得注意的地方:就是重边。题目没有告诉你两个城市之间只有一条路可走,所以两个城市之间可能有多条路可以走。

举例: 输入可以包含 1 2 3  // 1到2的成本为3

           1 2 5  //1到2的成本为5

             因此此时应选成本较低的路。

然后,已经连通的城市之间的连通成本为0。

这题用G++提交得到984ms的反馈,用C++提交则得到484ms的反馈。

很想知道这个时间差是怎么回事。

另外,这题一定还可以优化。

#include <iostream>
#include <cstring>
#include <cstdio>
using namespace std;

const int maxn = 500+10;
int dis[maxn][maxn]; //存两地间的距离
bool vis[maxn];      //是否已经加入树
int temp[maxn];
int shortP[maxn];
const int INF = 65523655;
int n,m,k;

inline void input() //初始及输入
{
    cin>>n>>m>>k;
    int i,j;
    for(i=1;i<=n;i++)
        for(j=1;j<=n;j++)
        dis[i][j]=INF;
    int p,q,r;
    while(m--)
    {
        scanf("%d%d%d",&p,&q,&r);
        if( r<dis[p][q] )        //这一句保证存入的是两地间距离的最小值
            dis[p][q]=dis[q][p]=r;
    }
    int t;
    memset(temp,0,sizeof(temp));
    while(k--)
    {
        scanf("%d",&t);
        for(i=1;i<=t;i++)
            scanf("%d",&temp[i]);
        for(i=1;i<=t;i++)
            for(j=i+1;j<=t;j++)
                dis[ temp[i] ][ temp[j] ]=dis[ temp[j] ][ temp[i] ]=0;
    }
    memset(vis,false,sizeof(vis));
    for(i=1;i<=n;i++)
        shortP[i]=INF;
}

inline int span() //求最低成本
{
    int cost=0;
    int pos=1,k;
    int count=0;
    int i,minC=INF;
    vis[1]=true;
    while(count<n-1) //判断最小生成树是否已经完成
    {
        for(i=1;i<=n;i++)
            if( !vis[i] && shortP[i] > dis[pos][i] )
                shortP[i]=dis[pos][i];
        k=-1;
        minC=INF;
        for(i=1;i<=n;i++)
            if( !vis[i] && minC > shortP[i] )
            {
                minC=shortP[i];
                k=i;
            }
        if(k==-1)
            return -1; //判断是否还可以再把一个城市加进来
        cost += shortP[k];
        vis[k]=true;
        pos=k;
        count++;
    }
    return cost;
}

int main()
{
    int T;
    while(cin>>T)
    {
        int flag;
        while(T--)
        {
            input();
            flag = span();
            cout<<flag<<endl;
        }
    }
    return 0;
}
时间: 2024-10-27 09:24:36

Hdu 3371 Connect the Cities(最小生成树)的相关文章

hdu 3371 Connect the Cities (最小生成树Prim)

题目连接:http://acm.hdu.edu.cn/showproblem.php?pid=3371 题目不难 稍微注意一下 要把已经建好的城市之间的花费定义为0,在用普通Prim算法就可以了:我没有用克鲁斯卡尔算法(Kruskal's algorithm),因为这题数据比较大,而且要处理大量的数据使它为0,怕超时T^T..... 1 #include<iostream> 2 #include<cstdio> 3 #include<algorithm> 4 5 usi

hdu 3371 Connect the Cities 最小生成树

#include <stdio.h> #include <string.h> #include <iostream> #include <algorithm> #include <vector> #include <queue> #include <stack> #include <set> #include <map> #include <string> #include <ma

hdu 3371 Connect the Cities

链接:hdu 3371 已知已连通的路的序号,以及未连通的路的费用,求将所有城市连通的最小费用 也是将已连通的路的费用记为0,就转化成了基本最小生成树的题 不过这题数组要开的大点,不然很容易就RE了... #include<cstdio> #include<algorithm> using namespace std; int f[510],n,m; struct stu { int a,b,c; }t[100000]; int cmp(struct stu x,struct st

hdu 3371 Connect the Cities(prim算法)

题目链接: http://acm.hdu.edu.cn/showproblem.php?pid=3371 Connect the Cities Time Limit: 2000/1000 MS (Java/Others)    Memory Limit: 32768/32768 K (Java/Others) Total Submission(s): 13628    Accepted Submission(s): 3679 Problem Description In 2100, since

HDU 3371 Connect the Cities 【最小生成树,Prime算法+Kruskal算法】

Connect the Cities Time Limit: 2000/1000 MS (Java/Others)    Memory Limit: 32768/32768 K (Java/Others) Total Submission(s): 17167    Accepted Submission(s): 4335 Problem Description In 2100, since the sea level rise, most of the cities disappear. Tho

hdu 3371 Connect the Cities Prim + Kruskal两种算法分别AC 水过~~~~

Connect the Cities Time Limit: 2000/1000 MS (Java/Others)    Memory Limit: 32768/32768 K (Java/Others) Total Submission(s): 11727    Accepted Submission(s): 3278 Problem Description In 2100, since the sea level rise, most of the cities disappear. Tho

HDU 3371 Connect the Cities(并查集+Kruskal)

题目网址:http://acm.hdu.edu.cn/showproblem.php?pid=3371 思路: 这道题很明显是一道最小生成树的题目,有点意思的是,它事先已经让几个点联通了.正是因为它先联通了几个点,所以为了判断连通性 很容易想到用并查集+kruskal. 不过要注意 这题有一个坑点,就是边数很多 上限是25000,排序的话可能就超时了.而点数则比较少 上限是500,所以很多人选择用Prim做.但我个人觉得这样连通性不好判断.其实边数多没关系,我们主要去重就好啦,用邻接矩阵存下两点

POJ:3371 Connect the Cities(最小生成树)

http://acm.hdu.edu.cn/showproblem.php?pid=3371 AC代码: /** /*@author Victor /* C++ */ #include <bits/stdc++.h> #include<iostream> #include<algorithm> #include<cstdlib> #include<cstring> #include<cstdio> #include<string

hdu oj 3371 Connect the Cities (最小生成树)

Connect the Cities Time Limit: 2000/1000 MS (Java/Others)    Memory Limit: 32768/32768 K (Java/Others) Total Submission(s): 9985    Accepted Submission(s): 2843 Problem Description In 2100, since the sea level rise, most of the cities disappear. Thou