zoukankan      html  css  js  c++  java
  • 【JZOJ3237】间谍派遣【最小生成树】

    题目大意:

    题目链接:https://jzoj.net/senior/#main/show/3237
    给出nn个点,连接任意两个点i,ji,j需要花费a[i,j]a[i,j],将任意点ii连向源点需要花费b[i]b[i],求最小花费。


    思路:

    这又是一道裸题。。。
    题目描述说的多么高大上啊什么,害得我一开始敲了一个费用流,结果发现就是最小生成树。。。
    在这里插入图片描述
    诶最小生成树的思路就不用我说了吧。


    代码:

    #include <cstdio>
    #include <algorithm>
    using namespace std;
    typedef long long ll;
    
    const int N=1210;
    int n,S,father[N*N];
    ll ans;
    
    struct node
    {
    	int x,y,cost;
    }a[N*N];
    
    int C(int x,int y)
    {
    	return (x-1)*n+y;
    }
    
    bool cmp(node x,node y)
    {
    	return x.cost<y.cost;
    }
    
    int find(int x)
    {
    	return x==father[x]?x:father[x]=find(father[x]);
    }
    
    int main()
    {
    	scanf("%d",&n);
    	S=N-1;
    	for (int i=1;i<=n;i++)
    		for (int j=1;j<=n;j++)
    		{
    			int id=C(i,j);
    			scanf("%d",&a[id].cost);
    			a[id].x=i; a[id].y=j;
    		}
    	for (int i=1;i<=n;i++)
    	{
    		scanf("%d",&a[n*n+i].cost);
    		a[n*n+i].x=S; a[n*n+i].y=i;
    	}
    	sort(a+1,a+1+n*n+n,cmp);
    	for (int i=1;i<=n*n+n;i++)
    		father[i]=i;
    	for (int i=1;i<=n*n+n;i++)
    	{
    		int x=find(a[i].x),y=find(a[i].y);
    		if (x!=y)
    		{
    			ans+=(ll)a[i].cost;
    			father[x]=y;
    		}
    	}
    	printf("%lld
    ",ans);
    	return 0;
    }
    
  • 相关阅读:
    spring hibernate 调用存储过程
    Mybatis mapper配置
    流量红包算法
    带搜索的下拉框Chosen
    生成二维码
    Linux netlink机制
    OpenFlow Switch学习笔记(七)——Matching Fields
    Hierarchical Token Bucket
    OpenvSwitch架构
    Examining Open vSwitch Traffic Patterns
  • 原文地址:https://www.cnblogs.com/hello-tomorrow/p/11998089.html
Copyright © 2011-2022 走看看