zoukankan      html  css  js  c++  java
  • 【图论】【最小生成树】prim【AcWing】局域网&&繁忙的都市

    prime题目

    AcWing 1141. 局域网(Prim最小生成树)

    AcWing 1141. 局域网(Prim最小生成树)

    • 最小生成树prim做法,一点找一条最短的边,并把其他边给扔掉
    • 双向网线相当于是无向图
    • 此题先统计一下所有路径长,再把它减去prim返回的路径长可以得到最多科节省的资金
    • 相当于a-b=c,尽可能让b小点,从而使c大点
    #include<bits/stdc++.h>
    using namespace std;	
    int n,k,sum=0;
    const int N = 1e2+10,M =2e2+10,INF = 0x3f3f3f3f;
    int g[N][N];
    int prim()
    {
    	int res=0;
    	int dist[N];
    	bool used[N];
    	
    	memset(dist,0x3f,sizeof(dist));
    	memset(used,false,sizeof(used));
    	
    	for(int i=0;i<n;i++)
    	{
    		int t=-1;
    		for(int j=1;j<=n;j++)
    		{
    			if( (!used[j]) && (t==-1||dist[t]>dist[j]) )
    			    t=j;
    		}
    		
    		if(i&&dist[t]!=INF)res+=dist[t];
    		//当i=0时,只是对路径或者说是dist数组进行预热
    		//可能有不连通的存在 
    		
    		for(int j=1;j<=n;j++)
    		   dist[j] = min(dist[j],g[t][j]);
    		   
    		used[t] = true;//用完不要再用了 
    	}
    	return res;
    }
    int main()
    {
        memset(g,0x3f,sizeof(g));
    	cin>>n>>k;
    	for(int i=0;i<k;i++)
    	{
    		int I,J,m;
    		cin>>I>>J>>m;
    		g[I][J]=g[J][I]=min(g[I][J],m);//处理重边和双向路径
    	    sum+=m;
    	}
    	cout<<sum-prim();
    	return 0;
    }
    

    AcWing 1142. 繁忙的都市(Prim最小生成树)

    AcWing 1142. 繁忙的都市

    #include<bits/stdc++.h>
    using namespace std;	
    int n,k,sum=0;
    const int N = 1e2+10,M =2e2+10,INF = 0x3f3f3f3f;
    int g[N][N];
    int prim()
    {
    	int res=0;
    	int dist[N];
    	bool used[N];
    	
    	memset(dist,0x3f,sizeof(dist));
    	memset(used,false,sizeof(used));
    	
    	for(int i=0;i<n;i++)
    	{
    		int t=-1;
    		for(int j=1;j<=n;j++)
    		{
    			if( (!used[j]) && (t==-1||dist[t]>dist[j]) )
    			    t=j;
    		}
    		
    		if(i&&dist[t]!=INF)res+=dist[t];
    		//当i=0时,只是对路径或者说是dist数组进行预热
    		//可能有不连通的存在 
    		
    		for(int j=1;j<=n;j++)
    		   dist[j] = min(dist[j],g[t][j]);
    		   
    		used[t] = true;//用完不要再用了 
    	}
    	return res;
    }
    int main()
    {
        memset(g,0x3f,sizeof(g));
    	cin>>n>>k;
    	for(int i=0;i<k;i++)
    	{
    		int I,J,m;
    		cin>>I>>J>>m;
    		g[I][J]=g[J][I]=min(g[I][J],m);//处理重边和双向路径
    	    sum+=m;
    	}
    	cout<<sum-prim();
    	return 0;
    }
    
  • 相关阅读:
    golang中,new和make的区别
    k8s客户端库
    k8s 拉取私有镜像
    kubernetes-client / python
    k8s集群外go客户端示例
    K8s获取NodePort
    KUBERNETES中的服务发现机制与方式
    Rancher容器目录持久化
    rancher k8s 实现pod弹性伸缩
    在Terminal里,使用Shift+Insert来代替鼠标右键来进行粘贴操作
  • 原文地址:https://www.cnblogs.com/BeautifulWater/p/15036729.html
Copyright © 2011-2022 走看看