hackerrank Roads and Libraries(DFS/并查集)

题目:https://www.hackerrank.com/challenges/torque-and-development/problem
题意:q组test,n个城市,m条损坏的路,在每个城市修图书馆代价为clib,修每条路为croad,求所有城市都能接触到图书馆的最小花费
思路:首先情况有两种,每个L点连通图修一个图书馆、L-1路,每个L点连通图修L个图书馆,所以如果croad >= clib的话,直接建n个图书馆就行了;找连通图的L-1路用DFS或者并查集
ps:注意描述的croad , clib顺序和输入的不一样,害得我多写了个并查集才发现,哭

1.DFS直接找每个连通分量的点数就行了,贴个官方题解的代码:
#include <bits/stdc++.h>
using namespace std;

vector<int> adj[100005];
bool visited[100005];
long nodes;

void DFS(int n)
{
    nodes++;
    visited[n] = true;
    for(vector<int>::iterator i = adj[n].begin(); i != adj[n].end() ; i++)
    {
        if(!visited[*i])
            DFS(*i);
    }
}


int main()
{
    int T;
    cin >> T;
    while(T--)
    {
        int N,M,a,b;
        long X,Y;
        cin >> N >> M >> X >> Y;

        for(int i = 0 ; i < M ; i++)
        {
            cin >> a >> b;
            adj[a].push_back(b);
            adj[b].push_back(a);
        }

        long cost=0;

        for(int i = 1 ; i <= N ; i++)
        {
            if(!visited[i])
            {
                nodes = 0;
                DFS(i);
                cost = cost + X;
                if(X > Y)
                    cost = cost + (Y*(nodes-1));
                else
                    cost = cost + (X*(nodes-1));
            }
        }

        cout << cost << endl;
        for(int i=0 ; i<=N ; i++)
        {
            adj[i].clear();
            visited[i] = false;
        }
    }

    return 0;
}
2.并查集代码:
#include <bits/stdc++.h>
using namespace std;

typedef long long ll;
const int INF = 0x3f3f3f3f;
const int N = 100005;
int f[N];
void init()
{
    for(int i = 1;i < N;i++)
        f[i] = i;
}
int getf(int x)
{
    return x == f[x] ? x : f[x] = getf(f[x]);
}
void merge(int u,int v)
{
    int fu = getf(u);
    int fv = getf(v);
    if(fu != fv)
        f[fv] = fu;
}
int main()
{
    int q,n,m,croad,clib,u,v;
    scanf("%d",&q);
    while(q--)
    {
        init();
        scanf("%d%d%d%d",&n,&m,&clib,&croad);
        while(m--)
        {
            scanf("%d%d",&u,&v);
            merge(u,v);
        }
        if(croad >= clib){
            printf("%lld\n",1ll*clib*n);
            continue;
        }
        ll ans = 0;
        for(int i = 1;i <= n;i++)
            if(f[i] == i)
                ans += clib;//建图书馆
            else
                ans += croad;
        printf("%lld\n",ans);
    }
    return 0;
}
s3://spacenet-dataset/spacenet/SN5_roads/tarballs/SN5_roads_test_public_AOI_9_San_Juan.tar.gz 是一个 Amazon S3 存储桶中的文件路径,指向一个名为 "SN5_roads_test_public_AOI_9_San_Juan.tar.gz" 的压缩文件。您可以按照以下步骤使用这个文件: 1. 安装并配置 AWS CLI:首先,您需要安装并配置 AWS 命令行界面(AWS CLI)。您可以在 AWS 官方文档(https://docs.aws.amazon.com/cli/latest/userguide/cli-configure-files.html)中找到安装和配置 AWS CLI 的详细说明。 2. 下载压缩文件:使用 AWS CLI 命令,您可以从 S3 存储桶中下载压缩文件。在命令行中运行以下命令: ``` aws s3 cp s3://spacenet-dataset/spacenet/SN5_roads/tarballs/SN5_roads_test_public_AOI_9_San_Juan.tar.gz . ``` 这将从 S3 存储桶中复制压缩文件到当前目录。 3. 解压缩文件:使用适当的解压缩工具(如tar或gzip)解压缩下载的压缩文件。在命令行中运行以下命令: ``` tar -zxvf SN5_roads_test_public_AOI_9_San_Juan.tar.gz ``` 这将解压缩文件并提取其中的内容。 4. 使用数据:解压缩后,您可以根据需要使用其中的数据。请查看数据集文档或相关说明以了解数据集的结构、格式和用途。 请注意,上述步骤假设您已正确安装和配置了 AWS CLI,并且具有访问指定 S3 存储桶的权限。如果您在使用 AWS CLI 或访问 S3 存储桶时遇到任何问题,请参考 AWS CLI 文档或咨询 AWS 支持以获取帮助。 希望这些信息对您有所帮助!如有其他问题,请随时提问。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值