zoukankan      html  css  js  c++  java
  • 畅通工程

    题目描述:
        某省调查城镇交通状况,得到现有城镇道路统计表,表中列出了每条道路直接连通的城镇。省政府“畅通工程”的目标是使全省任何两个城镇间都可以实现交通(但不一定有直接的道路相连,只要互相间接通过道路可达即可)。问最少还需要建设多少条道路?
    输入:
        测试输入包含若干测试用例。每个测试用例的第1行给出两个正整数,分别是城镇数目N ( < 1000 )和道路数目M;随后的M行对应M条道路,每行给出一对正整数,分别是该条道路直接连通的两个城镇的编号。为简单起见,城镇从1到N编号。
        注意:两个城市之间可以有多条道路相通,也就是说
        3 3
        1 2
        1 2
        2 1
        这种输入也是合法的
        当N为0时,输入结束,该用例不被处理。
    输出:
        对每个测试用例,在1行里输出最少还需要建设的道路数目。
    样例输入:
    4 2
    1 3
    4 3
    3 3
    1 2
    1 3
    2 3
    5 2
    1 2
    3 5
    999 0
    0
    样例输出:
    1
    0
    2
    998


    #include<iostream>
    #include<stdio.h>
    #include<algorithm>
    using namespace std;
    int path[1003];
    
    int findroot(int a){
    	int temp=a;
    	while (path[a] != -1){
    		a=path[a];
    	}
    	int temp2;
    	//改进,使树的高度变矮,宽度增加,方便找根 
    	while (path[temp]!= -1){
    		temp2=path[temp];
    		path[temp]=a;
    		temp=temp2;
    	}
    	return a;
    }
    
    int main (){
    	int m,n;
    	while (cin>>n>>m && n!=0){
    		for (int i=1;i<=n;i++)
    		path[i]=-1;
    		int least=-1;
    		int a,b;
    		while (m--){
    			cin >>a>>b;
    			a=findroot(a);
    			b=findroot(b);
    			if (a!=b){
    				path[a]=b;
    			} 
    		}
    		for (int i=1;i<=n;i++){//只要数有几个根就行了
    			if (path[i] == -1)
    			least++;
    		}
    		cout<<least<<endl;
    	} 
    }
    
    图论的并查集,很厉害。用来数联通集的个数。
    我犯了一个错误,least的初始值给了0,那样输出来的是连通集的个数,其实还得减一
     
     
     
     
  • 相关阅读:
    使用nexus 管理pip 私有包
    gitingore && opensource license 自动生成的网站
    lua-resty-qless-web UI 界面运行
    自定义pip 包开发简单说明
    ethr 微软开源的tcp udp http 网络性能测试工具
    openresty 集成lua-resty-mail +smtp2http 扩展灵活的mail 服务
    masterlab 敏捷项目管理工具
    luarocks 自定义包发布试用
    vorpal 又一个方便的cli 开发包
    gogs wekan 集成试用
  • 原文地址:https://www.cnblogs.com/yexiaoqi/p/7232401.html
Copyright © 2011-2022 走看看