Advertisement
dipBRUR

Min Cost Max Flow

Oct 4th, 2018
185
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
C++ 6.45 KB | None | 0 0
  1. #define ll                     long long
  2. #define INF                    123456789
  3.  
  4. static const int MAXN = 5*100+5;
  5.  
  6. vector <int> graph[MAXN];
  7. ll cap[MAXN][MAXN], flow[MAXN][MAXN], cost[MAXN][MAXN], dis[MAXN];
  8. int father[MAXN];
  9. bool vis[MAXN], inQueue[MAXN];
  10.  
  11. bool SPFA(int S, int T)
  12. {
  13.     fill(begin(dis), end(dis), INF);
  14.     fill(begin(inQueue), end(inQueue), false);
  15.     queue <int> PQ;
  16.     PQ.push(S);
  17.     dis[S] = 0;
  18.     inQueue[S] = true;
  19.     while (!PQ.empty())
  20.     {
  21.         int u = PQ.front(); PQ.pop();
  22.         inQueue[u] = false;
  23.         for (int v : graph[u])
  24.         {
  25.             if (flow[v][u] > 0 && dis[u] + (-cost[v][u]) < dis[v])
  26.             {
  27.                 dis[v] = dis[u] + (-cost[v][u]);
  28.                 father[v] = u;
  29.                 if (!inQueue[v])
  30.                 {
  31.                     inQueue[v] = true;
  32.                     PQ.push(v);
  33.                 }
  34.             }
  35.             else if (cap[u][v] > flow[u][v] && dis[u] + cost[u][v] < dis[v])
  36.             {
  37.                 dis[v] = dis[u] + cost[u][v];
  38.                 father[v] = u;
  39.                 if (!inQueue[v])
  40.                 {
  41.                     inQueue[v] = true;
  42.                     PQ.push(v);
  43.                 }
  44.             }
  45.         }
  46.     }
  47.     return dis[T] != INF;
  48. }
  49.  
  50. ll findMinFlow(int S, int T)
  51. {
  52.     ll bottleneck = INF;
  53.     for (int u = T; u != S; u = father[u])
  54.         bottleneck = min(bottleneck, cap[father[u]][u] - flow[father[u]][u]);
  55.     return bottleneck;
  56. }
  57.  
  58. void updateFlow(int S, int T, ll bottleneck)
  59. {
  60.     for (int u = T; u != S; u = father[u])
  61.     {
  62.         flow[father[u]][u] += bottleneck;
  63.         flow[u][father[u]] -= bottleneck;
  64.     }
  65. }
  66.  
  67. ll MCMF(int S, int T)
  68. {
  69.     ll maxFlow = 0;
  70.     ll minCost = 0;
  71.     while (SPFA(S, T))
  72.     {
  73.         ll bottleneck = findMinFlow(S, T);
  74.         updateFlow(S, T, bottleneck);
  75.         maxFlow += bottleneck;
  76.         minCost += (dis[T] * bottleneck);
  77.     }
  78.     if (maxFlow == 2)
  79.         return minCost;
  80.     return -1;
  81. }
  82.  
  83. void INITIALIZE()
  84. {
  85.     for (int i = 0; i < MAXN; i++)
  86.     {
  87.         graph[i].clear();
  88.     }
  89.     memset(flow, 0, sizeof(flow));
  90.     memset(cap, 0, sizeof(cap));
  91.     memset(cost, 0, sizeof(cost));
  92. }
  93.  
  94. int main()
  95. {
  96.     //freopen("in.txt", "r", stdin);
  97.  
  98.     int tNode, tEdge;
  99.     while (scanf("%d", &tNode) == 1)
  100.     {
  101.         if (tNode == 0)
  102.             break;
  103.         INITIALIZE();
  104.         scanf("%d", &tEdge);
  105.         for (int e = 0; e < tEdge; e++)
  106.         {
  107.             int u, v;
  108.             ll c;
  109.             scanf("%d %d %lld", &u, &v, &c);
  110.  
  111.             graph[u].push_back(v);
  112.             graph[v].push_back(u);
  113.  
  114.             cap[u][v] = cap[v][u] = 1;
  115.             cost[u][v] = cost[v][u] = c;
  116.         }
  117.         int S = 0;
  118.         int T = tNode + 1;
  119.  
  120.         graph[S].push_back(1);
  121.         graph[1].push_back(S);
  122.  
  123.         cost[S][1] = cost[1][S] = 0;
  124.         cap[S][1] = cap[1][S] = 2;
  125.  
  126.         graph[tNode].push_back(T);
  127.         graph[T].push_back(tNode);
  128.  
  129.         cost[tNode][T] = cost[T][tNode] = 0;
  130.         cap[tNode][T] = cap[T][tNode] = 2;
  131.  
  132.         ll res = MCMF(S, T);
  133.         if (res == -1)
  134.             puts("Back to jail");
  135.         else
  136.             printf("%lld\n", res);
  137.     }
  138. }
  139. #define ll                     long long
  140. #define INF                    123456789
  141.  
  142. static const int MAXN = 5*100+5;
  143.  
  144. vector <int> graph[MAXN];
  145. ll cap[MAXN][MAXN], flow[MAXN][MAXN], cost[MAXN][MAXN], dis[MAXN];
  146. int father[MAXN];
  147. bool vis[MAXN], inQueue[MAXN];
  148.  
  149. bool SPFA(int S, int T)
  150. {
  151.     fill(begin(dis), end(dis), INF);
  152.     fill(begin(inQueue), end(inQueue), false);
  153.     queue <int> PQ;
  154.     PQ.push(S);
  155.     dis[S] = 0;
  156.     inQueue[S] = true;
  157.     while (!PQ.empty())
  158.     {
  159.         int u = PQ.front(); PQ.pop();
  160.         inQueue[u] = false;
  161.         for (int v : graph[u])
  162.         {
  163.             if (flow[v][u] > 0 && dis[u] + (-cost[v][u]) < dis[v])
  164.             {
  165.                 dis[v] = dis[u] + (-cost[v][u]);
  166.                 father[v] = u;
  167.                 if (!inQueue[v])
  168.                 {
  169.                     inQueue[v] = true;
  170.                     PQ.push(v);
  171.                 }
  172.             }
  173.             else if (cap[u][v] > flow[u][v] && dis[u] + cost[u][v] < dis[v])
  174.             {
  175.                 dis[v] = dis[u] + cost[u][v];
  176.                 father[v] = u;
  177.                 if (!inQueue[v])
  178.                 {
  179.                     inQueue[v] = true;
  180.                     PQ.push(v);
  181.                 }
  182.             }
  183.         }
  184.     }
  185.     return dis[T] != INF;
  186. }
  187.  
  188. ll findMinFlow(int S, int T)
  189. {
  190.     ll bottleneck = INF;
  191.     for (int u = T; u != S; u = father[u])
  192.         bottleneck = min(bottleneck, cap[father[u]][u] - flow[father[u]][u]);
  193.     return bottleneck;
  194. }
  195.  
  196. void updateFlow(int S, int T, ll bottleneck)
  197. {
  198.     for (int u = T; u != S; u = father[u])
  199.     {
  200.         flow[father[u]][u] += bottleneck;
  201.         flow[u][father[u]] -= bottleneck;
  202.     }
  203. }
  204.  
  205. ll MCMF(int S, int T)
  206. {
  207.     ll maxFlow = 0;
  208.     ll minCost = 0;
  209.     while (SPFA(S, T))
  210.     {
  211.         ll bottleneck = findMinFlow(S, T);
  212.         updateFlow(S, T, bottleneck);
  213.         maxFlow += bottleneck;
  214.         minCost += (dis[T] * bottleneck);
  215.     }
  216.     if (maxFlow == 2)
  217.         return minCost;
  218.     return -1;
  219. }
  220.  
  221. void INITIALIZE()
  222. {
  223.     for (int i = 0; i < MAXN; i++)
  224.     {
  225.         graph[i].clear();
  226.     }
  227.     memset(flow, 0, sizeof(flow));
  228.     memset(cap, 0, sizeof(cap));
  229.     memset(cost, 0, sizeof(cost));
  230. }
  231.  
  232. int main()
  233. {
  234.     //freopen("in.txt", "r", stdin);
  235.  
  236.     int tNode, tEdge;
  237.     while (scanf("%d", &tNode) == 1)
  238.     {
  239.         if (tNode == 0)
  240.             break;
  241.         INITIALIZE();
  242.         scanf("%d", &tEdge);
  243.         for (int e = 0; e < tEdge; e++)
  244.         {
  245.             int u, v;
  246.             ll c;
  247.             scanf("%d %d %lld", &u, &v, &c);
  248.  
  249.             graph[u].push_back(v);
  250.             graph[v].push_back(u);
  251.  
  252.             cap[u][v] = cap[v][u] = 1;
  253.             cost[u][v] = cost[v][u] = c;
  254.         }
  255.         int S = 0;
  256.         int T = tNode + 1;
  257.  
  258.         graph[S].push_back(1);
  259.         graph[1].push_back(S);
  260.  
  261.         cost[S][1] = cost[1][S] = 0;
  262.         cap[S][1] = cap[1][S] = 2;
  263.  
  264.         graph[tNode].push_back(T);
  265.         graph[T].push_back(tNode);
  266.  
  267.         cost[tNode][T] = cost[T][tNode] = 0;
  268.         cap[tNode][T] = cap[T][tNode] = 2;
  269.  
  270.         ll res = MCMF(S, T);
  271.         if (res == -1)
  272.             puts("Back to jail");
  273.         else
  274.             printf("%lld\n", res);
  275.     }
  276. }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement