zoukankan      html  css  js  c++  java
  • 【9002】局域网

    Time Limit: 1 second
    Memory Limit: 256 MB

    问题描述
    某个局域网内有n(n<=100)台计算机,由于搭建局域网时工作人员的疏忽,现在局域网内的连接形成了回路,我们知道如果局域网形成回路那么数据将不听的在回路内传输,造成网路卡的现象。因为连接计算机的网线本身不同,所以有一些连线不是很畅通,我们用f(i,j)表示i,j之间连接的畅通程度(f(i,j)<=1000),f(i,j)值越小表示i,j之间连接越通畅,f(i,j)为0表示i,j之间无网线连接。现在我们需要解决回路问题,我们将除去一些连线,使得网络中设有回路,并且被除去网线的∑f(i,j)最大,请求出这个最大值。    

    Input

    第一行两个正整数n,k,接下来的k行每行三个正整数i、j、m表示i、j两台计算机之间有网线联通,通畅程度为m。

    Output

    一个正整数,∑f(i,j)的最大值

    Sample Input

    5 5
    1 2 8
    1 3 1
    1 5 3
    2 4 5
    3 4 2
    

    Sample Output

    8 
    
    

    【题解】

    如果最后剩余的网线,刚好够n台电脑连接,且少一条线都不行。那么这样的连线方式肯定是最佳的。也即用n-1条线连接n台电脑。然后保证这n-1条线是最优的即可。关于克鲁斯卡尔的贪心策略。我们顺序排了一下。

    我们在找顺序找边的时候,考虑一下,如果当前边可以连接两个不同的集合。而你不选,那么之后的边如果能连接这两个集合,那么肯定要付出更大的花费。肯定不如就选这条边的方案优。

    【代码】

    #include <cstdio>
    #include <algorithm>
    
    using namespace std;
    
    struct edge //用结构体 进行排序比较方便。 
    {
    	int fr,to,w;
    };
    
    int su,su2,n,k,f[101],tt = 0; //su是所有一开始所有网络的累加和 su2是最小生成树的累加和 
    edge a[10001];
    
    void input_data()
    {
    	scanf("%d%d",&n,&k);
    	for (int i = 1;i <= n;i++) //并查集的初始化操作 
    		f[i] = i;
    	for (int i = 1;i <= k;i++)
    		{
    			scanf("%d%d%d",&a[i].fr,&a[i].to,&a[i].w);
    			su+=a[i].w;
    		}
    }
    
    int findfather(int x) //并查集用来寻找根节点的操作,同时压缩路径 
    {
    	if (f[x]!=x)
    		f[x] = findfather(f[x]);
    	return f[x];
    }
    
    int cmp(const edge & a,const edge & b) //sort函数的比较函数在algorithm头文件中 
    {
    	if (a.w < b.w) //不等号决定了你的排序是如何排的 
    		return 1;
    	return 0;
    }
    
    void get_ans()
    {
    	for (int i = 1;i <= k;i++) //枚举k条边同时累加MST的和 
    		{
    			int x= a[i].fr,y = a[i].to;
    			int r1 = findfather(x),r2 = findfather(y); //如果能联通这两个区域,就连同,因为后面如果再出现
    			//一条边也能连同这个两个区域,所需的花费肯定更大了! 
    			if (r1!=r2)
    				{
    					f[r2] = r1;
    					su2+=a[i].w;
    					tt++;
    					if (tt == n-1) //找到n-1条边了就结束。 
    						return;
    				}
    		}
    }
    
    void output_ans()
    {
    	printf("%d",su-su2);	
    }
    
    int main()
    {
    	//freopen("F:\rush.txt","r",stdin);
    	input_data();
    	sort(a+1,a+1+k,cmp);
    	get_ans();
    	output_ans();
    	return 0;	
    }


  • 相关阅读:
    mysql 全量备份和增量备份
    mysql 修改密码提示ERROR 1819 (HY000): Your password does not satisfy the current policy requirements
    MHA 常见问题解决
    MHA 数据库高可用+ GTID 同步测试部署
    通过电脑抓手机端log
    用js递归遍历树结构
    js实现全屏
    使表格随着内容自适应宽度
    POST请求
    vue中组件通信
  • 原文地址:https://www.cnblogs.com/AWCXV/p/7632376.html
Copyright © 2011-2022 走看看