FZU2169 shadow题解
2014-05-15 21:56
381 查看
http://acm.fzu.edu.cn/problem.php?pid=2169
#include<iostream> #include <cstdio> #include <cstring> #include <cstdlib> #include<vector> #include<queue> #include<set> #define MAXN 101111 #define RE freopen("in.txt","r",stdin); using namespace std; struct Edge { int u,v; int next; }; Edge e[MAXN*2]; int first[MAXN]; int en; void add(int u,int v) { e[en].u=u; e[en].v=v; e[en].next=first[u]; first[u]=en; en++; } int n,k,cnt; int a[MAXN]; set<int> b; bool walked[MAXN]; bool geted[MAXN]; queue<int> v; int from[MAXN]; int farm(); void init(); int main() { //RE while(scanf("%d%d",&n,&k)!=EOF) { farm(); } return 0; } int farm() { int i,j,x,y; init(); for(i=0; i<n; i++) scanf("%d",&a[i]); for(i=0; i<k; i++) { scanf("%d",&x); x--; b.insert(x); } for(i=0; i<n-1; i++) { scanf("%d%d",&x,&y); x--;y--; add(y,x); add(x,y); } long long ans=0; while(!v.empty()) v.pop(); v.push(0); walked[0]==true; geted[0]=true; while(!v.empty()) { int now=v.front(); v.pop(); //cout<<now<<'!'; if(b.find(now)!=b.end()) { //cout<<now<<','; x=now; while(!geted[x]) { geted[x]=true; ans+=a[x]; x=from[x]; } cnt++; if(cnt==k) break; continue; } for(j=first[now]; j!=-1; j=e[j].next) { //cout<<j<<'?'; int next=e[j].v; if(!walked[next]) { walked[next]=true; v.push(next); from[next]=now; } } } printf("%lld\n",ans); return 0; } void init() { memset(e,0,sizeof(e)); memset(first,-1,sizeof(first)); memset(walked,false,sizeof(walked)); memset(geted,false,sizeof(geted)); b.clear(); cnt=0; en=0; } View Code 话说我交的时候突然想起set没清空,不过还是过了,难道只有一组数据… 不过耗时好像比其他方法久……好像可以手动开栈 深搜,我也不太懂怎么弄的 相关文章推荐
|