akoj-1016-连接电脑

本文介绍了一个关于机房内电脑连接的问题,通过算法确定最少需要增加多少条网线以实现所有电脑间的连通。该问题涉及到图论中的连通性和最小生成树概念。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

连接电脑

Time Limit:1000MS  Memory Limit:65536K
Total Submit:46 Accepted:8

Description

Description: 

机房里有若干台电脑,其中有一些电脑已经相互连接。如果A和B通过网线相连,并且B与C也通过网线相连,那么即便A和C之间没有直接的网线相连,也可以认为A和C是相连的。由于机房里的布线比较乱,并不是所有电脑都相互连通,请问在不变动当前布线情况下,最少要购买几条网线才能使得机房所有电脑都两两连通。 

Input

Input: 

多组数据。每组数据第一行为整数N,M。N是电脑数量,M是机房已布置好的网线数量。接下来M行,每行为整数A,B。表明A,B之间通过一条网线直接相连。这里可以认为网线是不分方向的,即A->B等价于B->A。 
(0 < N <= 200,0 <= M <= 10000,0 < A,B <= N 。) N=0和M=0为输入结束,不需要处理。

Output

Output: 

每组一个整数,即最少还要购买几根网线。

Sample Input

Sample Input:
4 2
1 2
2 3
4 0
1 0
0 0

Sample Output

Sample Output:
1
3
0

Source

ahstu@ICPC01

[Submit]   [Go Back]   [Status]   [Discuss]

思路:代码改自1140英雄联盟阵营,加入了前两行的判断语句,然后相连的电脑置为同一个数,count既用来置数也用来计数,还有未连接的电脑,一台电脑需要一根线,count++即可,这里可能需要注意下p,q输入是反着的情况,就是防止胡乱输入两个数,而1140题则是以按由小到大输入写的。

#include<iostream>
using namespace std;
int main()
{
    int n,m;
    while(cin>>n>>m){
          int p,q,a[201]= {0},count=1;
        if(n==0&&m==0)break;
        if(m==0&&n!=0){cout<<n-1<<endl;continue;}
        cin>>p>>q;
        a[p]=a[q]=count;
        for(int i=1; i<m; i++){
            cin>>p>>q;
            if(a[p]!=0)a[q]=count;
            else if(a[q]!=0)a[p]=count;
            else {
                count++;
                a[p]=count;
                a[q]=a[p];
            }
        }
        for(int i=1; i<=n; i++)if(a[i]==0)count++;//这里是判断1...n,第一次写成0...n-1,wrong了一次
        cout<<count-1<<endl;
    }
    return 0;
}

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值