Advertisement
yicongli

HDU6445

Mar 24th, 2019
148
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
C++ 2.23 KB | None | 0 0
  1. #include<bits/stdc++.h>
  2.  
  3. using namespace std;
  4.  
  5. #define gc c=getchar()
  6. #define r(x) read(x)
  7. #define ll long long
  8.  
  9. template<typename T>
  10. inline void read(T&x){
  11.     x=0;T k=1;char gc;
  12.     while(!isdigit(c)){if(c=='-')k=-1;gc;}
  13.     while(isdigit(c)){x=x*10+c-'0';gc;}x*=k;
  14. }
  15.  
  16. const int N=1005;
  17. const int M=N*3;
  18. const int INF=0x3f3f3f3f;
  19.  
  20. int ecnt=1;
  21. int fir[N];
  22. int nex[M];
  23. int from[M];
  24. int to[M];
  25. int f[M];
  26. int w[M];
  27.  
  28. int tot,S,T;
  29. int h[N];
  30. int dis[N];
  31. int lst[N];
  32.  
  33. inline bool dijkstra(){
  34.     memset(dis+1,INF,tot<<2);
  35.     priority_queue<pair<int,int> >Q;
  36.     Q.push(make_pair(dis[S]=0,S));
  37.     while(!Q.empty()){
  38.         int d=-Q.top().first;
  39.         int x=Q.top().second;
  40.         Q.pop();
  41.         if(dis[x]!=d)continue;
  42.         for(int i=fir[x];i;i=nex[i]){
  43.             int v=to[i];
  44.             if(f[i]&&dis[v]>dis[x]+w[i]+h[x]-h[v]){
  45.                 lst[v]=i;
  46.                 dis[v]=dis[x]+w[i]+h[x]-h[v];
  47.                 if(dis[v]<dis[T]){
  48.                     Q.push(make_pair(-dis[v],v));
  49.                 }
  50.             }
  51.         }
  52.     }
  53.     return dis[T]!=INF;
  54. }
  55.  
  56. int MinCost,MaxFlow;
  57.  
  58. inline void MCMF(){
  59.     MinCost=MaxFlow=0;
  60.     while(dijkstra()){
  61.         int flow=INF;
  62.         for(int i=T,e;i!=S;i=from[e]){
  63.             flow=min(flow,f[e=lst[i]]);
  64.         }
  65.         MaxFlow+=flow;
  66.         MinCost+=flow*(dis[T]+h[T]-h[S]);
  67.         for(int i=T,e;i!=S;i=from[e]){
  68.             e=lst[i];
  69.             f[e]-=flow;
  70.             f[e^1]+=flow;
  71.         }
  72.         for(int i=1;i<=tot;++i){
  73.             h[i]+=dis[i];
  74.         }
  75.     }
  76. }
  77.  
  78. inline void addedge(int u,int v,int flow,int cost){
  79.     nex[++ecnt]=fir[u],fir[u]=ecnt,from[ecnt]=u,to[ecnt]=v,f[ecnt]=flow,w[ecnt]=cost;
  80.     nex[++ecnt]=fir[v],fir[v]=ecnt,from[ecnt]=v,to[ecnt]=u,f[ecnt]=0,w[ecnt]=-cost;
  81. }
  82.  
  83. int deg[N];
  84.  
  85. inline void add(int e,int u,int v){
  86.     addedge(S,e,1,0);
  87.     addedge(e,u,1,0);
  88.     addedge(e,v,1,0);
  89.     addedge(u,T,1,deg[u]++);
  90.     addedge(v,T,1,deg[v]++);
  91. }
  92.  
  93. char s[N][N];
  94.  
  95. int main(){
  96. //  freopen(".in","r",stdin);
  97. //  freopen(".out","w",stdout);
  98.     int TestCase;r(TestCase);
  99.     while(TestCase--){
  100.         int n;r(n);
  101.         for(int i=1;i<=n;++i){
  102.             scanf("%s",s[i]+1);
  103.             for(int j=1;j<=n;++j){
  104.                 if(s[i][j]=='1'){
  105.                     deg[i]++;
  106.                 }
  107.             }
  108.         }
  109.         tot=n;
  110.         S=++tot;
  111.         T=++tot;
  112.         int sum=0;
  113.         for(int i=1;i<=n;++i){
  114.             sum+=deg[i]*(deg[i]-1)/2;
  115.         }
  116.         for(int i=1;i<=n;++i){
  117.             for(int j=i+1;j<=n;++j){
  118.                 if(s[i][j]=='2'){
  119.                     add(++tot,i,j);
  120.                 }
  121.             }
  122.         }
  123.         MCMF();
  124.         printf("%d\n",n*(n-1)*(n-2)*(n-3)-(n-3)*8*(sum+MinCost));
  125.         memset(fir+1,0,tot<<2);
  126.         memset(deg+1,0,n<<2);
  127.         ecnt=1;
  128.     }
  129. }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement