codeforces 893C Rumor 前向星+dfs

893C Rumor

思路:

前向星+DFS

代码:

#include <bits/stdc++.h>
using namespace std;
#define _for(i,a,b) for(int i=(a); i<(b); ++i)
#define _rep(i,a,b) for(int i=(a); i<=(b); ++i)
typedef long long ll;
const ll maxn = 100005;
const ll maxm = 200005;
struct node {
    int to,next;
} edges[maxm];
int n,m,u,v,cnt=0,head[maxn],vis[maxn];
ll w[maxn],minvalue,sum;
void add(int u, int v) {
    edges[cnt].to=v;
    edges[cnt].next=head[u];
    head[u]=cnt++;
}
void dfs(int s) {
    int t;
    for(int i=head[s]; i!=-1; i=edges[i].next) {
        t=edges[i].to;
        if(!vis[t]) {
            vis[t]=1;
            minvalue=min(minvalue,w[t]);
            dfs(t);
        }
    }
}
int main() {
    ios::sync_with_stdio(false);
    cin.tie(0);
    cout.tie(0);
    memset(head,-1,sizeof(head));
    cin>>n>>m;
    _rep(i,1,n) cin>>w[i];
    _rep(i,1,m) {
        cin>>u>>v;
        add(u,v);
        add(v,u);
    }
    sum=0;
    _rep(i,1,n) {
        if(vis[i]) continue;
        minvalue=w[i];
        vis[i]=1;
        dfs(i);
        sum+=minvalue;
    }
    cout<<sum<<endl;
    return 0;
}
posted @ 2017-11-26 00:05  lemonsbiscuit  阅读(325)  评论(2编辑  收藏  举报