zoukankan      html  css  js  c++  java
  • CSU 1249 竞争性酶抑制剂和同工酶

    1249: 竞争性酶抑制剂和同工酶

    Time Limit: 1 Sec  Memory Limit: 128 MB
    Submit: 109  Solved: 49

    Description

    人体内很多化学反应都需要酶来催化。酶的功能可以简单理解为:将一种物质(底物)转化为另一种物质(目标产物)。
    竞争性酶抑制剂会与底物竞争酶上的结合位点,当抑制剂达到一定剂量时,底物便竞争不过抑制剂,难以与酶结合,从而使反应无法进行。
    结构不同但催化相同化学反应的酶称为一组同工酶。通常一种抑制剂只能抑制一种酶。当一种酶被它的抑制剂所抑制时,可以通过同工酶的催化使反应得以继续进行。如果一组同工酶全部被抑制,反应自然就无法再进行。但人体内的反应是千变万化的,一条反应途径被阻断,还可以通过其他反应途径,使底物经过多步转化,最终转化为目标产物。
    现在已知各种物质之间的转化关系及抑制每种酶所需的抑制剂剂量,那么最少需要多少剂量的抑制剂,才能彻底阻断某种两种物质之间的转化呢?

    Input

    多组测试数据。对于每一组测试数据:
    第一行两个整数:N、M,分别表示物质的种数、酶的种数(2<=N<=150)(0<=M<=5000)。N种物质分别编号为1到N。
    接下来M行,每行描述一种酶。一行有三个整数A、B、C,表示这种酶可将A物质转化为B物质;若要抑制这种酶,需要相应的抑制剂C克(0<=C<=100000)。这M种酶中,有不少是同工酶,同工酶不超过250组。
    最后一行,两个整数S、D,表示要彻底阻止S物质转化为D物质。

    Output

    每组测试数据输出一行。所需抑制剂的最小总量。

    Sample Input

    5 6
    2 1 2
    3 5 1
    2 3 7
    1 5 3
    3 4 4
    4 5 5
    2 5
    3 4
    1 3 7
    2 3 5
    1 3 6
    1 2 3
    1 3
    3 2
    1 2 2
    1 3 4
    2 3
    150 0
    1 150

    Sample Output

    7
    16
    0
    0

    HINT

     

    Source

    CSU Monthly 2012 Apr.

    解题:很明显最小割

     1 #include <iostream>
     2 #include <cstdio>
     3 #include <cstring>
     4 #include <cmath>
     5 #include <algorithm>
     6 #include <climits>
     7 #include <vector>
     8 #include <queue>
     9 #include <cstdlib>
    10 #include <string>
    11 #include <set>
    12 #include <stack>
    13 #define LL long long
    14 #define pii pair<int,int>
    15 #define INF 0x3f3f3f3f
    16 using namespace std;
    17 const int maxn = 2000;
    18 struct arc{
    19     int to,flow,next;
    20     arc(int x = 0,int y = 0,int z = -1){
    21         to = x;
    22         flow = y;
    23         next = z;
    24     }
    25 };
    26 arc e[maxn<<3];
    27 int head[maxn],d[maxn],cur[maxn];
    28 int tot,S,T,n,m;
    29 void add(int u,int v,int flow){
    30     e[tot] = arc(v,flow,head[u]);
    31     head[u] = tot++;
    32     e[tot] = arc(u,0,head[v]);
    33     head[v] = tot++;
    34 }
    35 bool bfs(){
    36     queue<int>q;
    37     memset(d,-1,sizeof(d));
    38     d[T] = 1;
    39     q.push(T);
    40     while(!q.empty()){
    41         int u = q.front();
    42         q.pop();
    43         for(int i = head[u]; ~i; i = e[i].next){
    44             if(e[i^1].flow && d[e[i].to] == -1){
    45                 d[e[i].to] = d[u] + 1;
    46                 q.push(e[i].to);
    47             }
    48         }
    49     }
    50     return d[S] > -1;
    51 }
    52 int dfs(int u,int low){
    53     if(u == T) return low;
    54     int tmp = 0,a;
    55     for(int &i = cur[u]; ~i; i = e[i].next){
    56         if(e[i].flow && d[e[i].to]+1==d[u]&&(a=dfs(e[i].to,min(e[i].flow,low)))){
    57             e[i].flow -= a;
    58             e[i^1].flow += a;
    59             low -= a;
    60             tmp += a;
    61             if(!tmp) break;
    62         }
    63     }
    64     if(!tmp) d[u] = -1;
    65     return tmp;
    66 }
    67 int dinic(){
    68     int ans = 0;
    69     while(bfs()){
    70         memcpy(cur,head,sizeof(head));
    71         ans += dfs(S,INF);
    72     }
    73     return ans;
    74 }
    75 int main() {
    76     int u,v,w;
    77     while(~scanf("%d %d",&n,&m)){
    78         memset(head,-1,sizeof(head));
    79         for(int i = tot = 0; i < m; ++i){
    80             scanf("%d %d %d",&u,&v,&w);
    81             add(u,v,w);
    82         }
    83         scanf("%d %d",&S,&T);
    84         printf("%d
    ",dinic());
    85     }
    86     return 0;
    87 }
    View Code
  • 相关阅读:
    「JavaSE 重新出发」05.03.02 在运行时使用反射分析对象
    「JavaSE 重新出发」05.03.01 利用反射分析类
    「JavaSE 重新出发」05.03 反射
    「JavaSE 重新出发」05.02 泛型数组列表、包装类
    scp 命令简明介绍
    《鸟哥的Linux私房菜》笔记——04. 简单命令行
    《鸟哥的Linux私房菜》笔记——03. 磁盘分区
    「JavaSE 重新出发」05.01.02 hashCode 方法、toString 方法
    「JavaSE 重新出发」05.01.01 equals 方法
    「JavaSE 重新出发」05.01 继承
  • 原文地址:https://www.cnblogs.com/crackpotisback/p/4129245.html
Copyright © 2011-2022 走看看