首页 > 代码库 > CSU 1249 竞争性酶抑制剂和同工酶
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 62 1 23 5 12 3 71 5 33 4 44 5 52 53 41 3 72 3 51 3 61 2 31 33 21 2 21 3 42 3150 01 150
Sample Output
71600
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 long14 #define pii pair<int,int>15 #define INF 0x3f3f3f3f16 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 }
CSU 1249 竞争性酶抑制剂和同工酶
声明:以上内容来自用户投稿及互联网公开渠道收集整理发布,本网站不拥有所有权,未作人工编辑处理,也不承担相关法律责任,若内容有误或涉及侵权可进行投诉: 投诉/举报 工作人员会在5个工作日内联系你,一经查实,本站将立刻删除涉嫌侵权内容。