poj3140

来源:互联网 发布:数据终端设备dte 编辑:程序博客网 时间:2024/05/14 20:10

好久没有自己的思路过题了!!!

发现自己越来越水了,看到m的取值范围比n大,让我想了好长一段时间,题中说的是树的,怎么可能m比n大???后来才觉得这就是糊弄人的啊!发现这点就好做了,注意要使用long long ,devc++的long是32位,为了这个又贡献了几次wa,好歹自己也是过了题了啊!

#include<iostream> #include<string>#include<cstdio>#include<cmath>#include<cstring>#include<algorithm>#include<queue>#include<stack>#include<vector>#include<climits>using namespace std; #define rep(i,n) for(i=0; i<(n); i++)#define repf(i,n,m) for(i=(n); i<=(m); i++)//正循环的#define repd(i,n,m) for(i=(n); i>=(m); i--) //负循环的 #define fab(a) (a)>0?(a):0-(a) #define ll long long#define arc(a) (a)*(a)#define inf 1000000000   //最大值的#define exp 0.0000001     //浮点型的#define N  100005   //记录开的数组ll sum;struct node{    int pre,y;}a[N*2];ll b[N];ll Min;int pre[N],len;void addpage(int u,int v){    a[len].y=v;    a[len].pre=pre[u];    pre[u]=len++;}void dfs(int fa,int s){     int i,j,y;     for(i=pre[s];i!=-1; i=a[i].pre)     {          y=a[i].y;           if(y==fa)            continue;             dfs(s,y);          b[s]+=b[y];     }      Min=min(Min,fab(sum-b[s]-b[s])); }int main(){    int n,m,i,j,k;    int ror=0;    while(scanf("%d%d",&n,&m))    {       ror++;        if(n==0 && m==0)         break;         memset(pre,-1,sizeof(pre));         sum=0;         len=1;        Min=100000000000000;        repf(i,1,n)        {            scanf("%lld",&b[i]);            sum+=b[i];        }         repf(i,1,m)        {            scanf("%d%d",&j,&k);            addpage(j,k);            addpage(k,j);        }        dfs(-1,1);//1默认为根节点的         printf("Case %d: %lld\n",ror,Min);    }    return 0;}