zoukankan      html  css  js  c++  java
  • 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 }
  • 相关阅读:
    NSURLSession 网络请求
    NSData 数据
    NSStream文件流
    NSFileManager文件管理
    NSCache 缓存
    NSUserDefaults数据存储
    NSKeyedArchiver数据归档
    子线程定时器的创建
    NSEnumerator迭代器
    NSDate 时间
  • 原文地址:https://www.cnblogs.com/InWILL/p/5838987.html
Copyright © 2011-2022 走看看