数据中心

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

 

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值