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;
    }
    
  • 相关阅读:
    抑郁症:2019年11月9日
    NOIP2018考前抱佛脚——图论基础复习
    NOIP2018考前抱佛脚——搜索复习
    NOIP2018考前抱佛脚——数据结构基础及STL实现
    题解 P2920 【[USACO08NOV]时间管理Time Management】
    agc030C Coloring Torus
    agc036B Do Not Duplicate
    agc034C Tests
    AFO
    agc005D ~K Perm Counting
  • 原文地址:https://www.cnblogs.com/BeautifulWater/p/15036729.html
Copyright © 2011-2022 走看看