弗洛伊德思路:
先找到與1相連最短的那條路,然後再更新與1和剛纔相連的點每個與其他點最短的路存儲,然後再找到下一個點,再找到這三個點與其他點最短路存儲,以此類推。
Prim代碼:
除了最後一個ac代碼是自己的其他的都不是,wa的全是自己進步的過程,加油!
#include<iostream>
#include <cstdio>
#include <cmath>
#include <cstring>
#include <string>
#include <cmath>
#include <stack>
#include <queue>
#include <vector>
#include <set>
#include <map>
#include <functional>
#include <ctime>
#include <iomanip>
#include <sstream>
#include <algorithm>
#define ll long long
#define mes(x,y) memset(x,y,sizeof(x))
#define FAST_IO ios::sync_with_stdio(false);cin.tie(0);cout.tie(0)
using namespace std;
const ll INFF = 2000000;
const ll maxn = 99999999;
ll len[200][200], mm[200], dis[200];
ll Prim(ll n) {
ll sum = 0, k = 0;
mm[0] = 1;
for (ll i = 1; i < n; i++) {
ll minn = maxn;
for (ll j = 0; j < n; j++) {
if (!mm[j] && len[0][j] < minn) {
minn = len[0][j];
k = j;
}
}
mm[k] = 1;
sum += minn;
for (ll j = 0; j < n; j++)
len[0][j] = min(len[k][j], len[0][j]);
}
return sum;
}
int main() {
//FAST_IO;
ll n, m, k, i, j, vb;
string s;
while (cin >> n) {
mes(len, 0);
for (i = 0; i < n; i++)
for (j = 0; j < n; j++) {
cin >> len[i][j];
mm[j] = 0;
}
ll sum = Prim(n);
cout << sum << endl;
}
}
Kruskal代碼:
利用並查集,依次按最小的依次進行相連
#include<iostream>
#include <cstdio>
#include <cmath>
#include <cstring>
#include <string>
#include <cmath>
#include <stack>
#include <queue>
#include <vector>
#include <set>
#include <map>
#include <functional>
#include <ctime>
#include <iomanip>
#include <sstream>
#include <algorithm>
#define ll long long
#define mes(x,y) memset(x,y,sizeof(x))
#define FAST_IO ios::sync_with_stdio(false);cin.tie(0);cout.tie(0)
using namespace std;
const ll INFF = 2000000;
const ll maxn = 99999999;
struct node {
ll begin, end, value;
node(ll b,ll e,ll v):begin(b),end(e),value(v){}
bool operator <(const node& n1) const {
return value < n1.value;
}
};
vector<node>v;
vector<ll>parent;
ll GetValue(ll a) {
if (parent[a] == a)return a;
parent[a] = GetValue(parent[a]);
return parent[a];
}
void Cmb(ll a, ll b) {
ll l1 = GetValue(a), l2 = GetValue(b);
if (l1 != l2)parent[l2] = l1;
}
int main() {
//FAST_IO;
ll n, m, k, i, j, vb;
while (cin >> n) {
v.clear(); parent.clear();
for (i = 0; i <= n; i++)parent.push_back(i);
for (i = 0; i < n; i++) {
for (j = 0; j < n; j++) {
cin >> vb;
v.push_back(node(i, j, vb));
}
}
sort(v.begin(), v.end());
ll sum = 1, result = 0;
for (i = 0,j=v.size(); i < j && sum < n; i++) {
//cout << v[i].begin << " " << v[i].end << ":" << v[i].value << endl;
if (GetValue(v[i].begin) != GetValue(v[i].end)) {
sum++;
result += v[i].value;
Cmb(v[i].begin, v[i].end);
}
}
cout << result << endl;
}
}