poj3140 树的dfs

切记啊,n=1,abs,__int64……

#include <iostream> using namespace std; struct gtype { int y,next; }g[2000010]; int n,m,tot,first[100010],i,x,y,k=0; __int64 a[100010],ans; bool v[100010]; __int64 labs(__int64 x,__int64 y) { if (x-y>0) return x-y; else return y-x; } void add(int x,int y) { tot++; g[tot].y=y; g[tot].next=first[x]; first[x]=tot; tot++; g[tot].y=x; g[tot].next=first[y]; first[y]=tot; } void dfs(int x) { v[x]=true; for (int t=first[x];t!=-1;t=g[t].next) if (v[g[t].y]==false) { dfs(g[t].y); a[x]+=a[g[t].y]; } } int main() { while (cin >> n >> m) { if (n==0 && m==0) break; for (i=1;i<=n;i++) scanf("%I64d",&a[i]); memset(g,0,sizeof(g)); memset(first,-1,sizeof(first)); tot=0; while (m--) { scanf("%d%d",&x,&y); add(x,y); } memset(v,false,sizeof(v)); dfs(1); ans=a[1]; for (i=2;i<=n;i++) if (labs(a[i],a[1]-a[i])<ans) ans=labs(a[i],a[1]-a[i]); if (n==1) printf("Case %d: %I64d/n",++k,a[1]); else printf("Case %d: %I64d/n",++k,ans); } system("pause"); return 0; }  

你可能感兴趣的:(System)