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;
    }
    
  • 相关阅读:
    bzoj2763 [JLOI]飞行路线 分层图最短路
    [模板]分块/可修改莫队 (数颜色种类)
    gcd步数
    洛谷2378 因式分解 字符串
    bzoj1090 字符串折叠
    洛谷1034 NOIP2002 矩形覆盖
    Codeforces#441 Div.2 四*题
    SPFA的小优化
    洛谷1073 NOIP2009 最优贸易
    bzoj2100 [Usaco2010 DEC]Apple Delivery苹果贸易
  • 原文地址:https://www.cnblogs.com/BeautifulWater/p/15036729.html
Copyright © 2011-2022 走看看