©2015-2019王Liguang。すべての権利を保有。この記事では、ブロガーオリジナル記事です。いかなる形で許さブロガーなしに複製してはならない、それ以外の場合は、あなたの法的責任を追及します。あなたは(上の記事を参照してください)サイトの声明に合意したことを意味し、この記事を読んでいます!この記事は、参考値です、あなた自身のスクリーニングの有効性、何の問題は、ブロガーは一切の責任を負いませんしてください!
タイトル
質問番号:201812から4つ
の質問名:データセンターの
制限時間:1.0秒
メモリ制限:512.0メガバイトの
問題の説明:
サンプル入力
4
5
1
1 2
1 3 4
1 4 5
2 3 8
3 4 2
サンプル出力
4
サンプル説明
以下のサンプルの説明があります。
分析
非常に複雑ですが、サンプルの注意深い観察が、実際には、最小スパニングツリーの問題を発見した後、対象が、でもどの位置にルートノードを考慮する必要がない限り、問題を求めて最小スパニングツリーなどの理由に関係なくどのような位置、これは、対象者の要件を満たすためです。
コード
コード1:CMP書き込み機能、コンテナを使用せず
#include <bits/stdc++.h>
using namespace std;
#define MAX 100001
#define MAXN 500001
struct Edge{
int u;
int v;
int w;
Edge(){};
Edge(int u1, int v1, int w1):u(u1), v(v1), w(w1){}
};
int pre[MAXN];
Edge edge[MAX];
bool cmp(Edge e1, Edge e2){
return e1.w < e2.w;
}
int find(int root){
int tmp, son;
son = root;
while(root != pre[root]){
root = pre[root];
}
while(son != root){
tmp = pre[son];
pre[son] = root;
son = root;
}
return root;
}
bool join(int x, int y){
int rootx = find(x);
int rooty = find(y);
if(rootx != rooty){
pre[rootx] = rooty;
return true;
}
return false;
}
int main(){
int n = 0, m = 0, root = 0, i = 0, ans = 0, num = 0;
cin >> n >> m >> root;
for(i=0; i<n; i++){
pre[i] = i;
}
for(i=0; i<m; i++){
cin >> edge[i].u >> edge[i].v >> edge[i].w;
}
sort(edge, edge+m, cmp);
for(i=0; i<m; i++){
if(join(edge[i].u, edge[i].v)){
ans = edge[i].w;
num += 1;
if(num == n-1){
break;
}
}
}
cout << ans << endl;
return 0;
}
コード2:コンテナを使用せずに、オペレータ<過負荷状態
#include <bits/stdc++.h>
using namespace std;
#define MAX 100001
#define MAXN 500001
struct Edge{
int u;
int v;
int w;
Edge(){};
Edge(int u1, int v1, int w1):u(u1), v(v1), w(w1){}
bool operator < (struct Edge &e1){
return this->w < e1.w;
}
};
int pre[MAXN];
Edge edge[MAX];
int find(int root){
int tmp, son;
son = root;
while(root != pre[root]){
root = pre[root];
}
while(son != root){
tmp = pre[son];
pre[son] = root;
son = root;
}
return root;
}
bool join(int x, int y){
int rootx = find(x);
int rooty = find(y);
if(rootx != rooty){
pre[rootx] = rooty;
return true;
}
return false;
}
int main(){
int n = 0, m = 0, root = 0, i = 0, ans = 0, num = 0;
cin >> n >> m >> root;
for(i=0; i<n; i++){
pre[i] = i;
}
for(i=0; i<m; i++){
cin >> edge[i].u >> edge[i].v >> edge[i].w;
}
sort(edge, edge+m, cmp);
for(i=0; i<m; i++){
if(join(edge[i].u, edge[i].v)){
ans = edge[i].w;
num += 1;
if(num == n-1){
break;
}
}
}
cout << ans << endl;
return 0;
}
コード3:オーバーロードされた<演算子、コンテナの使用
#include <bits/stdc++.h>
using namespace std;
struct Edge{
int u;
int v;
int w;
Edge(){}
Edge(int u1, int v1, int w1):u(u1), v(v1), w(w1){}
bool operator < (struct Edge &e1){
return this->w < e1.w;
}
};
const int maxn = 500001;
const int maxm = 100001;
int pre[maxn];
vector<Edge> edge;
int findx(int root){
int son, tmp;
son = root;
while(root != pre[root]){
root = pre[root];
}
while(son != root){
tmp = pre[son];
pre[son] = root;
son = tmp;
}
return root;
}
int join(int root1, int root2){
int x = findx(root1);
int y = findx(root2);
if(x != y){
pre[x] = y;
return true;
}
return false;
}
int main(){
int n = 0, m = 0, i = 0, ans = 0, num = 0, root = 0;
int tmp1, tmp2, tmp3;
cin >> n >> m >> root;
for(i=0; i<m; i++){
cin >> tmp1 >> tmp2 >> tmp3;
edge.push_back(Edge(tmp1, tmp2, tmp3));
}
for(i=0; i<n; i++){
pre[i] = i;
}
sort(edge.begin(), edge.end());
for(vector<Edge>::iterator it = edge.begin(); it != edge.end(); it++){
if(join(it->u, it->v)){
ans = it->w;
num++;
if(num == n-1){
cout << ans;
break;
}
}
}
return 0;
}