zoukankan      html  css  js  c++  java
  • 在矩阵上跑最小生成树

    题目背景

    c++ 一本通课后题

    题目描述

    有一个 M 行 N 列的点阵,相邻两点可以相连。一条纵向的连线花费一个单位,一条横向的连线花费两个单位。某些点之间已经有连线了,试问至少还需要花费多少个单位才能使所有的点全部连通。

    输入输出格式

    输入格式:

    第一行输入两个正整数 m 和 n。

    以下若干行每行四个正整数 x1,y1,x2,y2, 表示第 x1 行第 y1 列的点和第 x2 行第 y2 列的点已经有连线。输入保证|x1-x2|+|y1-y2|=1。

    输出格式:

    输出使得连通所有点还需要的最小花费。

    输入输出样例

    输入样例1:
    2 2
    1 1 2 1

    输出样例1:
    3


    这是一道很好的最小生成树的题

    考察了讲矩阵转化为一维的能力

    #include<cstdio>
    #include<iostream>
    #include<algorithm>
    using namespace std;
    struct node
    {
    	int point_1;
    	int point_2;
    	int value;
    };
    bool compare(const node &a,const node &b)
    {
    	return a.value<b.value;
    };
    int f[1001000];
    int find(int x)
    {
    	if(f[x]==x)
    		return x;
    	return f[x]=find(f[x]);
    }
    node line[5000000];
    int main()
    {
    	freopen("a.in","r",stdin);
    	int n,m;
    	scanf("%d%d",&n,&m);
    	for(int i=1;i<=n*m;i++)
    		f[i]=i;
    	int num=0;
    	for(int i=1;i<=n;i++)	
    	{
    		for(int j=1;j<=m;j++)
    		{
    			if(j!=m)
    			{
    				line[++num].point_1=m*(i-1)+j;
    				line[num].point_2=m*(i-1)+j+1;
    				line[num].value=2;
    			}
    			if(i!=n)
    			{
    				line[++num].point_1=m*(i-1)+j;
    				line[num].point_2=m*i+j;
    				line[num].value=1;
    			}
    		}
    	}
    	int a,b,c,d;
    	while(cin>>a>>b>>c>>d)
    	{
    		line[++num].point_1=m*(a-1)+b;
    		line[num].point_2=m*(c-1)+d;
    		line[num].value=0;
    	}
    	sort(line+1,line+1+num,compare);
    	int t=n*m;
    	int f1,f2;
    	int ans=0;
    	for(int i=1;i<=num;i++)
    	{
    		f1=find(line[i].point_1);
    		f2=find(line[i].point_2);
    		if(f1!=f2)
    		{
    			f[f1]=f2;
    			ans+=line[i].value;
    		}
    	}
    	printf("%d",ans);
    }
    

    我好弱呀!别人都6、700毫秒,我小5秒。

    %%%%

  • 相关阅读:
    Navigator对象关于语言的属性
    对ng-repeat的表格内容添加不同样式:ng-style
    ng-repeat
    ES 6 : 函数的扩展
    二维码下载,区分是 ios 和 android
    gulp配置备份
    [转]移动端web页面使用字体的思考
    移动开发总结
    前端优化:雅虎35条
    input填写银行卡号,每四位空一隔
  • 原文地址:https://www.cnblogs.com/Lance1ot/p/8569622.html
Copyright © 2011-2022 走看看