//Find函数有点小问题,,路径没压缩,压缩路径后就可以过了....找错是个费时费力的话....,,,改成另一种写法或者顺带压缩,就100了 不然就只有70......
#include<iostream>
#include<cstdio>
#include<queue>
#include<cstring>
#include<algorithm>
using namespace std;
const int N = 1e6+5;
int n, m, Max=0, root;
struct Edge{
int u, v, dist;
Edge(){
u = 0;
v = 0;
dist = 0;
};
Edge(int a, int b, int c){
u = a;
v = b;
dist = c;
}
bool operator <(const Edge &b)const
{
return dist < b.dist;
}
}edge;
Edge store[N];
int tot = 0;
/*//用于优先队列从小到大排序
bool operator <(Edge a, Edge b)
{
return a.dist > b.dist;
}*/
priority_queue<Edge> q;
//int judge[N][N] = {0};
int pre[N] = {0};
void init()
{
// memset(judge, 0, sizeof(judge));
for(int i=0; i<N; i++){
pre[i] = i;
}
}
int Findadjust(int a)
{
return a == pre[a] ? a : pre[a] = Find(pre[a]);//顺带路径压缩
}
int Find(int d)
{
if (pre[d]==d)
return d;
return pre[d]=Find(pre[d]);
// return a == pre[a] ? a : Find(pre[a]);
}
int Union(int a, int b)
{
a = Find(a), b = Find(b);
if(a == b){
return false;
}
else{
pre[a] = b;
return true;
}
}
void Addedge(int a, int b, int c)
{
store[tot].u = a;
store[tot].v = b;
store[tot++].dist = c;
}
/*
void Kruskal()
{
queue<Edge> p;
int sum = 0, num = 0;
while(!q.empty()){
edge = q.top();
q.pop();
if(Find(edge.u) != Find(edge.v)){
num ++;
sum += edge.dist;
p.push(Edge(edge.u, edge.v, edge.dist));
Union(edge.u, edge.v);
if(edge.dist > Max){
Max = edge.dist;
}
}
if(num >= n)
break;
}
cout << Max << endl;
// cout << num << endl;
while(!p.empty()){
edge = p.front();
// cout << edge.u << " " << edge.v << endl;
p.pop();
}
}
*/
void Kru()
{
sort(store, store+tot);
int num = 0;
for(int i=0; i<tot; i++){
edge = store[i];
if(Union(edge.u, edge.v)){
num ++;
// sum += edge.dist;
// p.push(Edge(edge.u, edge.v, edge.dist));
if(edge.dist > Max){
Max = edge.dist;
}
}
if(num >= n-1)
break;
}
printf("%d\n", Max);
// cout << Max << endl;
}
int main() {
scanf("%d%d%d", &n, &m, &root);
// cin >> n >> m >> root;
{
init();
// for(int i=0; i<n; i++){
for (int j = 0; j < m; j++) {
int u, v, l;
scanf("%d%d%d", &u, &v, &l);
// cin >> u >> v >> l;
Addedge(u, v, l);
//有向图
// judge[u][v] = 1;
// judge[v][u] = 1;
// q.push(Edge(u, v, l));
}
Max = 0;
// Kruskal();
Kru();
}
return 0;
}
知道哪70(超时)了.......Find里..........然后 就是关于加边的 按理来说应该是无向图,,但是 ,当Find直接如下return, 当加两条边进去只有50
#include<iostream>
#include<cstdio>
#include<queue>
#include<cstring>
#include<algorithm>
using namespace std;
const int N = 1e6+5;
int n, m, Max=0, root;
struct Edge{
int u, v, dist;
Edge(){
u = 0;
v = 0;
dist = 0;
};
Edge(int a, int b, int c){
u = a;
v = b;
dist = c;
}
bool operator <(const Edge &b)const
{
return dist < b.dist;
}
}edge;
Edge store[N];
int tot = 0;
/*//用于优先队列从小到大排序
bool operator <(Edge a, Edge b)
{
return a.dist > b.dist;
}*/
priority_queue<Edge> q;
//int judge[N][N] = {0};
int pre[N] = {0};
void init()
{
// memset(judge, 0, sizeof(judge));
for(int i=0; i<N; i++){
pre[i] = i;
}
}
int Find(int a)
{
return a == pre[a] ? a : Find(pre[a]);
}
int Union(int a, int b)
{
a = Find(a), b = Find(b);
if(a == b){
return false;
}
else{
pre[a] = b;
return true;
}
}
void Addedge(int a, int b, int c)
{
store[tot].u = a;
store[tot].v = b;
store[tot++].dist = c;
}
/*
void Kruskal()
{
queue<Edge> p;
int sum = 0, num = 0;
while(!q.empty()){
edge = q.top();
q.pop();
if(Find(edge.u) != Find(edge.v)){
num ++;
sum += edge.dist;
p.push(Edge(edge.u, edge.v, edge.dist));
Union(edge.u, edge.v);
if(edge.dist > Max){
Max = edge.dist;
}
}
if(num >= n)
break;
}
cout << Max << endl;
// cout << num << endl;
while(!p.empty()){
edge = p.front();
// cout << edge.u << " " << edge.v << endl;
p.pop();
}
}
*/
void Kru()
{
sort(store, store+tot);
int num = 0;
for(int i=0; i<tot; i++){
edge = store[i];
if(Union(edge.u, edge.v)){
num ++;
// sum += edge.dist;
// p.push(Edge(edge.u, edge.v, edge.dist));
if(edge.dist > Max){
Max = edge.dist;
}
}
if(num >= n-1)
break;
}
printf("%d\n", Max);
// cout << Max << endl;
}
int main() {
scanf("%d%d%d", &n, &m, &root);
// cin >> n >> m >> root;
{
init();
// for(int i=0; i<n; i++){
for (int j = 0; j < m; j++) {
int u, v, l;
scanf("%d%d%d", &u, &v, &l);
// cin >> u >> v >> l;
Addedge(u, v, l);
//有向图
// judge[u][v] = 1;
// judge[v][u] = 1;
// q.push(Edge(u, v, l));
}
Max = 0;
// Kruskal();
Kru();
}
return 0;
}
60分,,把主函数while去掉70分....超时.............
#include<iostream>
#include<cstdio>
#include<queue>
#include<cstring>
using namespace std;
const int N = 1e6+5;
int n, m, Max, root;
struct Edge{
int u, v, dist;
Edge(){
u = 0;
v = 0;
dist = 0;
};
Edge(int a, int b, int c){
u = a;
v = b;
dist = c;
}
}edge;
bool operator <(Edge a, Edge b)
{
return a.dist > b.dist;
}
priority_queue<Edge> q;
//int judge[N][N] = {0};
int pre[N] = {0};
void init()
{
// memset(judge, 0, sizeof(judge));
for(int i=0; i<N; i++){
pre[i] = i;
}
}
int Find(int a)
{
return a == pre[a] ? a : Find(pre[a]);
}
int Union(int a, int b)
{
a = Find(a), b = Find(b);
if(a == b){
return false;
}
else{
pre[a] = b;
return true;
}
}
void Kruskal()
{
queue<Edge> p;
int sum = 0, num = 0;
while(!q.empty()){
edge = q.top();
q.pop();
if(Find(edge.u) != Find(edge.v)){
num ++;
sum += edge.dist;
p.push(Edge(edge.u, edge.v, edge.dist));
Union(edge.u, edge.v);
if(edge.dist > Max){
Max = edge.dist;
}
}
if(num >= n)
break;
}
cout << Max << endl;
// cout << num << endl;
while(!p.empty()){
edge = p.front();
// cout << edge.u << " " << edge.v << endl;
p.pop();
}
}
int main() {
while(cin >> n >> m >> root){
while(!q.empty()){
q.pop();
}
init();
// for(int i=0; i<n; i++){
for (int j = 0; j < m; j++) {
int u, v, l;
cin >> u >> v >> l;
//有向图
// judge[u][v] = 1;
// judge[v][u] = 1;
q.push(Edge(u, v, l));
}
Max = 0;
Kruskal();
}
return 0;
}
20分
#include <iostream>
#include<algorithm>
#include<queue>
#include<stack>
using namespace std;
typedef long long ll;
const int maxn = 500000+5;
struct Edge{
int a, b, va;
}E[maxn];
int n, r, m;
int fa[maxn], deep[maxn];
priority_queue<int>q;
bool cmp(Edge a, Edge b){
return a.va < b.va;
}
int find(int x){
return x == fa[x]? x : find(fa[x]);
}
void unite(int a, int b){
int faa = find(a);
int fbb = find(b);
if(faa == fbb)
;
else fa[faa] = fbb;
return;
}
int MAX = 0;
void Kru(){
sort(E, E+r, cmp);//从小到大排序
//初始化
for(int i=0; i<r; i++){
fa[i] = i;
// deep[i] = 0;
}
int cnt = 0;
for(int i=0; i<r; i++){
if(find(E[i].a) != find(E[i].b)){
unite(E[i].a, E[i].b);
q.push(E[i].va);
if(MAX < E[i].va){
MAX = E[i].va;
}
if(cnt++ == n-2)//由于先判断后加 故为n-2
return;
}
}
return;
}
int main()
{
int root;
cin >> n >> r >> root;
for(int i=0; i<=n; i++){
fa[i] = -1;
// deep[i] = 0;
}
int dis[n+5][n+5];
for(int i=0; i<r; i++){
cin >> E[i].a >> E[i].b>> E[i].va;
dis[E[i].a][E[i].b] = E[i].va;
dis[E[i].b][E[i].a] = E[i].va;
}
Kru();
/* //adjust
int flag = 0;
int i = 1;
while(!q.empty()){
int tmp = q.top();
// cout << tmp << endl;
//for(int i=1; ; i++)
{
//if(dis[root][i] == tmp)
if(i == n)
{
cout << tmp << endl;
flag = 1;
break;
}
i++;
}
if(flag){
break;
}
q.pop();
}*/
//cout << q.top() << endl;
cout << MAX << endl;
return 0;
}