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 }