NOIP2012 疫情控制

代码还有点问题,先放这里存档

  1 #include<iostream>
  2 #include<cstdio>
  3 #include<cstring>
  4 #include<vector>
  5 #include<iterator>
  6 #include<algorithm>
  7 using namespace std;
  8 
  9 const int maxn=50010;
 10 int n,m;
 11 struct Edge
 12 {
 13     int u;
 14     long long w;
 15 }M[maxn],Node[maxn];
 16 vector<Edge> T[maxn];
 17 vector<int> P_n,M_n;
 18 int P[maxn];
 19 long long sum=0;
 20 bool Map[maxn];
 21 
 22 void init(int p)
 23 {
 24     vector<struct Edge>::iterator iter;
 25     for(iter=T[p].begin();iter!=T[p].end();iter++)
 26         if(M[iter->u].u==0)
 27         {
 28             M[iter->u].u=p;
 29             M[iter->u].w=iter->w;
 30             init(iter->u);
 31         }
 32         else
 33         {
 34             T[p].erase(iter);
 35             iter--;
 36         }
 37 }
 38 
 39 bool dfs(int a)
 40 {
 41     if(Map[a]) return true;
 42     bool F=true;
 43     for(int i=0;i<T[a].size();i++)
 44         if(!dfs(T[a][i].u))
 45             F=false;
 46     if(T[a].size()==0) F=false;
 47     return F;
 48 }
 49 
 50 bool cmp1(int a,int b)
 51 {
 52     return Node[a].w<Node[b].w;
 53 }
 54 bool cmp2(int a,int b)
 55 {
 56     return T[1][a].w<T[1][b].w;
 57 }
 58 bool cmp3(Edge a,Edge b)
 59 {
 60     if(a.u==b.u) return a.w>b.w;
 61     else return a.u<b.u;
 62 }
 63 
 64 bool check(long long a)
 65 {
 66     memset(Map,0,sizeof(Map));
 67     P_n.clear();
 68     M_n.clear();
 69     for(int i=0;i<m;i++)
 70     {
 71         Node[i].u=P[i];
 72         Node[i].w=a;
 73         while(M[Node[i].u].u!=1&&Node[i].w>=M[Node[i].u].w)
 74         {
 75             Node[i].w-=M[Node[i].u].w;
 76             Node[i].u=M[Node[i].u].u;
 77         }
 78         Map[Node[i].u]=true;
 79     }
 80     sort(Node,Node+m,cmp3);
 81     for(int i=0;i<m;i++)
 82     if(M[Node[i].u].u==1)
 83     {
 84         if(Node[i].u!=Node[i+1].u) Map[Node[i].u]=false;
 85         if(Node[i].w>=M[Node[i].u].w&&dfs(Node[i].u))
 86         {
 87             Node[i].w-=M[Node[i].u].w;
 88             Node[i].u=M[Node[i].u].u;
 89             P_n.push_back(i);
 90         }
 91         else Map[Node[i].u]=true;
 92     }
 93     for(int i=0;i<T[1].size();i++)
 94         if(!dfs(T[1][i].u))
 95             M_n.push_back(i);
 96     sort(P_n.begin(),P_n.end(),cmp1);
 97     sort(M_n.begin(),M_n.end(),cmp2);
 98     int j=0;
 99     for(int i=0;i<M_n.size();i++)
100     {
101         if(j>=P_n.size())
102             return false;
103         while(Node[P_n[j]].w<T[1][M_n[i]].w)
104         {
105             j++;
106             if(j>=P_n.size())
107                 return false;
108         }
109         j++;
110     }
111     return true;
112 }
113 
114 int main()
115 {
116     FILE *in,*out;
117     in=fopen("1.in","r");
118     fscanf(in,"%d",&n);
119     for(int i=1;i<n;i++)
120     {
121         int u,v,w;
122         fscanf(in,"%d %d %d",&u,&v,&w);
123         T[u].push_back(Edge{v,w});
124         T[v].push_back(Edge{u,w});
125         M[i].u=0;M[i].w=0;
126         sum+=w;
127     }
128     fclose(in);
129     M[n].u=0;M[n].w=0;
130     M[1].u=-1;
131     scanf("%d",&m);
132     for(int i=0;i<m;i++)
133         scanf("%d",&P[i]);
134     if(T[1].size()>m)
135     {
136         printf("-1");
137         return 0;
138     }
139     init(1);
140     long long L=0,R=sum,Mid;
141     while(L<R)
142     {
143         Mid=(L+R)>>1;
144         if(check(Mid)) R=Mid;
145         else L=Mid+1;
146     }
147     out=fopen("1.out","w");
148     fprintf(out,"%lld",L);
149     fclose(out);
150 }
原文地址:https://www.cnblogs.com/InWILL/p/5838987.html