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\n",dinic());

85     }

86     return 0;

87 }
View Code

 

你可能感兴趣的:(su)