[LUOGU] P2330 [SCOI 2005] 바 쁜 도시

    

  C           ,           ,                。  C         :    n     ,             ,                  。        ,                    。          ,             ,       。          ,               ,          :

1.                           。

21    ,        。

312    ,                    。

  :        ,         ,           。

      

    :
        n,m     n     ,m   。   m          ,u, v, c      u v       ,   c。(1≤n≤3001≤c≤100001≤m≤50000)

    :
    s, max,          ,               。

      

    #1:   
4 5
1 2 3
1 4 5
2 4 7
2 3 6
3 4 8
    #1:   
3 6

제목 의 뜻 이 약간 복잡 하고 교차점 은 바로 노드 이기 때문에 모든 점 의 합 이 가장 작은 것 은 나 무 를 만 드 는 것 이다. 변 수 는 반드시 n - 1 개 이 고 가장 긴 한 변 만 찾 으 면 된다.
//Writer:GhostCai && His Yellow Duck

#include
#include
#define MAXN 200000
using namespace std;

int m,n,ans;

int fa[MAXN];
int fnd(int x){
    if(fa[x]==x) return x;
    return fa[x]=fnd(fa[x]);
}
void cat(int x,int y){
    x=fnd(x);y=fnd(y);
    if(x!=y) fa[y]=x;
}

struct Edge{
    int x,y,w;
}e[MAXN]; 
int ecnt;
inline void add(int x,int y,int w){
    e[++ecnt].y = y;
    e[ecnt].x = x;
    e[ecnt].w = w;
}
bool cmp(const Edge x,const Edge y){
    return x.w < y.w ;
}


int main(){
    cin>>n>>m;
    int x,y,w;
    for(int i=1;i<=n;i++) fa[i]=i;
    for(int i=1;i<=m;i++){
        cin>>x>>y>>w;
        add(x,y,w);
    }
    sort(e+1,e+1+ecnt,cmp);
    int t=0;
    for(int i=1;i<=m;i++){
        int v=e[i].y ,u=e[i].x ;
        v=fnd(v);u=fnd(u);
        if(v!=u){
            cat(u,v);
            ans=max(e[i].w,ans);
            ++t;
        }
        if(t==n-1) break;
    }
    cout<1<<" "<return 0;
}

다음으로 전송:https://www.cnblogs.com/ghostcai/p/9247505.html

좋은 웹페이지 즐겨찾기