日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 编程资源 > 编程问答 >内容正文

编程问答

在矩阵上跑最小生成树

發布時間:2024/4/15 编程问答 31 豆豆
生活随笔 收集整理的這篇文章主要介紹了 在矩阵上跑最小生成树 小編覺得挺不錯的,現在分享給大家,幫大家做個參考.

題目背景

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秒。

%%%%

轉載于:https://www.cnblogs.com/Lance1ot/p/8569622.html

超強干貨來襲 云風專訪:近40年碼齡,通宵達旦的技術人生

總結

以上是生活随笔為你收集整理的在矩阵上跑最小生成树的全部內容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。