bzoj 1369: [Baltic2003]Gem

确实是神2333333333,一开始以为是01染色sb题,然而被打脸。。。

(蒟蒻不乱说,网上各种神犇的题解,还有图!!)

 1 #include <bits/stdc++.h>
 2 #define LL long long
 3 #define lowbit(x) x&(-x)
 4 #define inf 0x3f3f3f3f
 5 using namespace std;
 6 inline int ra()
 7 {
 8     int x=0,f=1; char ch=getchar();
 9     while (ch<'0' || ch>'9') {if (ch=='-') f=-1; ch=getchar();}
10     while (ch>='0' && ch<='9') {x=x*10+ch-'0'; ch=getchar();}
11     return x*f;
12 }
13 int n,cnt;
14 int head[10005],f[10005][25];
15 struct edge{
16     int to,next;
17 }e[20005];
18 void insert(int x, int y)
19 {
20     e[++cnt].next=head[x]; e[cnt].to=y; head[x]=cnt;
21 }
22 void dfs(int x, int fa)
23 {
24     for (int i=1; i<=20; i++)
25         f[x][i]=i;
26     for (int i=head[x];i;i=e[i].next)
27         if (e[i].to!=fa) dfs(e[i].to,x);
28     for (int j=1; j<=20; j++)
29     {
30         for (int i=head[x];i;i=e[i].next)
31             if (e[i].to!=fa)
32             {
33                 int mn=inf;
34                 for (int k=1; k<=20; k++)
35                     if (j!=k) mn=min(mn,f[e[i].to][k]);
36                 f[x][j]+=mn;
37             }
38     }
39 }
40 int main(int argc, char const *argv[])
41 {
42     n=ra();
43     for (int i=1; i<n; i++)
44     {
45         int x=ra(),y=ra();
46         insert(x,y); insert(y,x);
47     }
48     dfs(1,0);
49     int ans=inf;
50     for (int j=1; j<=20; j++)    
51         ans=min(ans,f[1][j]);
52     cout<<ans;
53     return 0;
54 }

 

posted @ 2017-03-06 20:57  ws_ccd  阅读(172)  评论(0编辑  收藏  举报