Time Limit: 1500/1000 MS (Java/Others)    Memory Limit: 131072/131072 K (Java/Others) Total Submission(s): 2331    Accepted Submission(s): 804

Problem Description
Jack likes to travel around the world, but he doesn’t like to wait. Now, he is traveling in the Undirected Kingdom. There are
without going berserk?
 
Input
The first line contains one integer
is the time limit before Jack goes berserk.
 
Output
You should print
must be different cities.
 
Sample Input
1 5 5 3 2 3 6334 1 5 15724 3 5 5705 4 3 12382 1 3 21726 6000 10000 13000
 
Sample Output
2 6 12
 
Source
 
 
 
其实这道题 队里之前讲过的 一直没有写...gg
一直TLE 然后学习了离线并查集 先排序 一边扫 一边存  还有计算几对的姿势也不好  he+=mp[ss]*mp[ee]
然后 然后 按着这个敲了还是超时 gg  太菜比了  并查集 以为了解的很深了
如下正解
int Find(int mubiao)
{
    if(parent[mubiao]!=mubiao)
        parent[mubiao]=Find(parent[mubiao]);//原来的姿势一直有bug
    return parent[mubiao];
}
 
 
#include<iostream>
#include<cstdio>
#include<algorithm>
#include<cstring>
using namespace std;
int t;
int n,m,q;
struct  path
{
    int s;
    int e;
    int dis;
     bool operator <(const path &x)const{
      return dis<x.dis;
     }
}P[100005];
struct limi
{
    int id;
    int limit;
    bool operator <(const limi &x)const{
      return limit<x.limit;
     }
}L[100005];
__int64 re[5005];
int parent[20005];
int mp[20005];
int Find(int mubiao)
{
    if(parent[mubiao]!=mubiao)
        parent[mubiao]=Find(parent[mubiao]);
    return parent[mubiao];
}
void init()
{
    for(int j=1;j<=n;j++)
    {
        parent[j]=j;
        mp[j]=1;
    }
    memset(re,0,sizeof(re));
}
int main()
{
    scanf("%d",&t);
    while(t--)
    {
        scanf("%d%d%d",&n,&m,&q);
        for(int i=0;i<m;i++)
            scanf("%d%d%d",&P[i].s,&P[i].e,&P[i].dis);
        sort(P,P+m);
        for(int i=0;i<q;i++)
        {
            L[i].id=i;
            scanf("%d",&L[i].limit);
        }
        sort(L,L+q);
        init();
        int gg=0;
        __int64 he=0;
        for(int i=0;i<q;i++)
        {
            while(gg<m&&L[i].limit>=P[gg].dis)
            {
                int ss=Find(P[gg].s);
                int ee=Find(P[gg].e);
                if(ss!=ee)
                {
                    he+=mp[ss]*mp[ee];
                    parent[ee]=ss;
                    mp[ss]+=mp[ee];
                }
                gg++;
            }
            re[L[i].id]=he;
        }
        for(int i=0;i<q;i++)
            printf("%I64d\n",2*re[i]);
}
return 0;
}

 

相关文章:

  • 2021-05-30
  • 2021-09-08
  • 2022-01-22
  • 2021-10-31
  • 2022-12-23
  • 2022-12-23
  • 2022-12-23
猜你喜欢
  • 2022-12-23
  • 2021-10-15
  • 2022-12-23
  • 2022-12-23
  • 2022-12-23
  • 2021-05-29
  • 2021-06-04
相关资源
相似解决方案