1258:Agri-Net

1258:Agri-Net

弗洛伊德思路:
先找到與1相連最短的那條路,然後再更新與1和剛纔相連的點每個與其他點最短的路存儲,然後再找到下一個點,再找到這三個點與其他點最短路存儲,以此類推。

除了第一個ac代碼是自己的其他的都不是,wa的全是自己進步的過程,加油!

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;
	}
}

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章