http://acm.hdu.edu.cn/showproblem.php?pid=3274
题目大意:在一棵树中找一棵包含所有我要的节点的最小生成子树。
直接搜索
#include <cstdio> #include <cstring> #include <iostream> #include <algorithm> #include <vector> #include <set> #include <map> #include <cmath> #include <queue> using namespace std; template <class T> void checkmin(T &t,T x) {if(x < t) t = x;} template <class T> void checkmax(T &t,T x) {if(x > t) t = x;} template <class T> void _checkmin(T &t,T x) {if(t==-1) t = x; if(x < t) t = x;} template <class T> void _checkmax(T &t,T x) {if(t==-1) t = x; if(x > t) t = x;} typedef pair <int,int> PII; typedef pair <double,double> PDD; typedef long long ll; #define foreach(it,v) for(__typeof((v).begin()) it = (v).begin(); it != (v).end ; it ++) const int N = 1111 , M = 2222; bool flag[N]; struct Edge { int v , w , next; Edge() {} Edge(int v,int w,int next):v(v),w(w),next(next) {} }edge[M]; int E , head[N]; int a; void init() { E = 0; memset(head,-1,sizeof(head)); } void addedge(int u,int v,int w) { edge[E] = Edge(v,w,head[u]); head[u] = E++; edge[E] = Edge(u,w,head[v]); head[v] = E++; } int ans; void dfs(int u,int fa) { for(int i=head[u];i!=-1;i=edge[i].next) { int v = edge[i].v; if(v == fa) continue; dfs(v , u); if(flag[v]) flag[u] = 1 , ans += edge[i].w; } } int n , m; int main() { while(~scanf("%d%d",&n,&m)) { init(); memset(flag , 0 ,sizeof(flag)); for(int i=0;i<m;i++) { scanf("%d",&a); flag[a] = 1; } for(int i=1;i<n;i++) { int u , v , w; scanf("%d%d%d",&u,&v,&w); addedge(u , v , w); } ans = 0; dfs(a , -1); printf("%d\n" , ans); } return 0; }