在矩阵上跑最小生成树
生活随笔
收集整理的這篇文章主要介紹了
在矩阵上跑最小生成树
小編覺得挺不錯的,現在分享給大家,幫大家做個參考.
題目背景
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年碼齡,通宵達旦的技術人生總結
以上是生活随笔為你收集整理的在矩阵上跑最小生成树的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 最小公倍数核心算法记录
- 下一篇: wiki文档书写格式