记录编号 251022 评测结果 AAAAAAAAAA
题目名称 能量网络 最终得分 100
用户昵称 Gravatardydxh 是否通过 通过
代码语言 C++ 运行时间 0.619 s
提交时间 2016-04-16 17:31:22 内存使用 4.79 MiB
显示代码纯文本
  1. /*
  2. Problem:Energynet;
  3. Language:c++;
  4. by dydxh;
  5. Date:2016.04.16;
  6. */
  7. #include<algorithm>
  8. #include<iostream>
  9. #include<cstring>
  10. #include<utility>
  11. #include<cstdlib>
  12. #include<cstdio>
  13. #include<string>
  14. #include<vector>
  15. #include<ctime>
  16. #include<cmath>
  17. #include<queue>
  18. #include<map>
  19. #include<set>
  20. #define ll long long
  21. #define ull unsigned long long
  22. using namespace std;
  23. const int oo=2000000000;
  24. const int maxn=1005;
  25. const int maxm=50005;
  26. typedef pair<int,int> Pii;
  27. int n,m,Len=1,Cnt,Super_s,Super_e;
  28. int A[maxn],B[maxn],Linkk[maxn+maxm];
  29. Pii E[maxm];
  30. struct edge{
  31. int y,next,v;
  32. }e[(maxm+maxn)*6];
  33. inline int read(){
  34. int x=0;bool flag=false;char ch=getchar();
  35. while(ch>'9' || ch<'0'){if(ch=='-') flag=true;ch=getchar();}
  36. while(ch>='0' && ch<='9'){x=x*10+ch-'0';ch=getchar();}
  37. return flag?-x:x;
  38. }
  39. void Insert(int a,int b,int c){
  40. e[++Len].next=Linkk[a],Linkk[a]=Len,e[Len].y=b,e[Len].v=c;
  41. e[++Len].next=Linkk[b],Linkk[b]=Len,e[Len].y=a,e[Len].v=0;
  42. //printf("%d->%d %d\n",a,b,c);
  43. }
  44. bool mycmp(Pii a,Pii b){
  45. return ((a.first<b.first) || a.first==b.first && A[a.second]<A[b.second]);
  46. }
  47. void Initialize(){
  48. n=read(),m=read();
  49. for(int i=1;i<=n;i++) A[i]=read();
  50. for(int i=1;i<=n;i++) B[i]=read();
  51. for(int i=1;i<=m;i++) E[i].first=read(),E[i].second=read();
  52. sort(E+1,E+1+m,mycmp);
  53. int Tot=0;
  54. for(int i=1;i<=m;i++){
  55. if(E[i].first==E[i-1].first && E[i].second==E[i-1].second) continue;
  56. E[++Tot]=E[i];
  57. }
  58. m=Tot;
  59. }
  60. void Build_Graph(){
  61. Super_s=0,Super_e=n+1,Cnt=n+1;
  62. for(int i=1,Last=1;i<=m;i=Last+1,Last=i){
  63. while(Last<m && E[Last].first==E[Last+1].first) Last++;
  64. for(int j=i;j<=Last;j++){
  65. ++Cnt;
  66. if(j!=i){
  67. Insert(Cnt-1,Cnt,oo);
  68. Insert(Super_s,Cnt,A[E[j].second]-A[E[j-1].second]);
  69. }
  70. else Insert(Super_s,Cnt,A[E[i].second]);
  71. Insert(Cnt,E[j].second,oo);
  72. }
  73. }
  74. for(int i=1;i<=n;i++) Insert(i,Super_e,B[i]);
  75. }
  76. int Head,Tail;
  77. int Q[maxn+maxm],Level[maxn+maxm];
  78. bool Make_Level(){
  79. memset(Level,-1,sizeof(Level));
  80. Level[Super_s]=0,Q[Tail=1]=Super_s,Head=0;
  81. while(Head<Tail){
  82. int Tn=Q[++Head];
  83. for(int i=Linkk[Tn];i;i=e[i].next){
  84. int Tmp=e[i].y;
  85. if(Level[Tmp]!=-1 || e[i].v==0) continue;
  86. Level[Tmp]=Level[Tn]+1,Q[++Tail]=Tmp;
  87. }
  88. }
  89. return Level[Super_e]!=-1;
  90. }
  91. inline int min(const int &a,const int &b){return a<b?a:b;}
  92. int Dfs(int x,int Flow){
  93. if(x==Super_e) return Flow;
  94. int D=0,Maxx=0;
  95. for(int i=Linkk[x];i && Maxx<Flow;i=e[i].next){
  96. int Tn=e[i].y;
  97. if(Level[Tn]!=Level[x]+1 || e[i].v==0) continue;
  98. D=Dfs(Tn,min(e[i].v,Flow-Maxx));
  99. if(D) e[i].v-=D,e[i^1].v+=D,Maxx+=D;
  100. }
  101. if(Maxx==0) Level[x]=-1;
  102. return Maxx;
  103. }
  104. int Dinic(){
  105. int Final=0;
  106. while(Make_Level())
  107. Final+=Dfs(Super_s,oo);
  108. return Final;
  109. }
  110. int main(){
  111. //freopen("cc.in","r",stdin);
  112. freopen("energynet.in","r",stdin);
  113. freopen("energynet.out","w",stdout);
  114. Initialize();
  115. Build_Graph();
  116. cout<<Dinic()<<endl;
  117. //cout<<"Time has passed:"<<1.0*clock()/1000<<"s!"<<endl;
  118. return 0;
  119. }