网站开发的逻辑,wordpress主题哪个好,网页制作与网站建设在线作业,北京互联网企业有哪些题目大概说有n个任务#xff0c;每个任务可以提前或推迟#xff0c;提前或推迟各有一定的费用#xff0c;有的任务一旦推迟另一个任务也必须推迟#xff0c;问怎么安排任务使花费最少#xff0c;且最少花费的条件下提前的任务数最多能多少。 问题就是要把各个任务分成两个…题目大概说有n个任务每个任务可以提前或推迟提前或推迟各有一定的费用有的任务一旦推迟另一个任务也必须推迟问怎么安排任务使花费最少且最少花费的条件下提前的任务数最多能多少。 问题就是要把各个任务分成两个集合。这么建容量网络求最小的S-T割源点向各个任务连容量为提前的费用的边各个任务向汇点连容量为推迟的费用的边如果A任务推迟B任务也必须推迟那么连A到B容量为INF的边。 这样求最小割就是最小的花费。S集合的点可以看作是选择推迟的任务T集合看作是选择提前的任务画画图就知道了。 而第二问。。结论就是。。设从源点沿非关键边floodfill得到的点数为n1不含源点从汇点反着floodfill得到的点数为n2不含汇点T中点最多的数目就是n2(n-n1-n2)即n-n1。 和判定最小割唯一性类似做法。。 1 #includecstdio2 #includecstring3 #includequeue4 #includealgorithm5 using namespace std;6 #define INF (130)7 #define MAXN 2228 #define MAXM 222*4449 10 struct Edge{11 int v,cap,flow,next;12 }edge[MAXM];13 int vs,vt,NE,NV;14 int head[MAXN];15 16 void addEdge(int u,int v,int cap){17 edge[NE].vv; edge[NE].capcap; edge[NE].flow0;18 edge[NE].nexthead[u]; head[u]NE;19 edge[NE].vu; edge[NE].cap0; edge[NE].flow0;20 edge[NE].nexthead[v]; head[v]NE;21 }22 23 int level[MAXN];24 int gap[MAXN];25 void bfs(){26 memset(level,-1,sizeof(level));27 memset(gap,0,sizeof(gap));28 level[vt]0;29 gap[level[vt]];30 queueint que;31 que.push(vt);32 while(!que.empty()){33 int uque.front(); que.pop();34 for(int ihead[u]; i!-1; iedge[i].next){35 int vedge[i].v;36 if(level[v]!-1) continue;37 level[v]level[u]1;38 gap[level[v]];39 que.push(v);40 }41 }42 }43 44 int pre[MAXN];45 int cur[MAXN];46 int ISAP(){47 bfs();48 memset(pre,-1,sizeof(pre));49 memcpy(cur,head,sizeof(head));50 int upre[vs]vs,flow0,augINF;51 gap[0]NV;52 while(level[vs]NV){53 bool flagfalse;54 for(int icur[u]; i!-1; iedge[i].next){55 int vedge[i].v;56 if(edge[i].cap!edge[i].flow level[u]level[v]1){57 flagtrue;58 pre[v]u;59 uv;60 //aug(aug-1?edge[i].cap:min(aug,edge[i].cap));61 augmin(aug,edge[i].cap-edge[i].flow);62 if(vvt){63 flowaug;64 for(upre[v]; v!vs; vu,upre[u]){65 edge[cur[u]].flowaug;66 edge[cur[u]^1].flow-aug;67 }68 //aug-1;69 augINF;70 }71 break;72 }73 }74 if(flag) continue;75 int minlevelNV;76 for(int ihead[u]; i!-1; iedge[i].next){77 int vedge[i].v;78 if(edge[i].cap!edge[i].flow level[v]minlevel){79 minlevellevel[v];80 cur[u]i;81 }82 }83 if(--gap[level[u]]0) break;84 level[u]minlevel1;85 gap[level[u]];86 upre[u];87 }88 return flow;89 }90 bool vis[MAXN];91 int dfs(int u){92 vis[u]1;93 int res(u!vs);94 for(int ihead[u]; i!-1; iedge[i].next){95 int vedge[i].v;96 if(vis[v] || edge[i].capedge[i].flow) continue;97 resdfs(v);98 }99 return res;
100 }
101 int main(){
102 int n,m,a,b;
103 while(~scanf(%d,n) n){
104 vs0; vtn1; NVvt1; NE0;
105 memset(head,-1,sizeof(head));
106 for(int i1; in; i){
107 scanf(%d,a);
108 addEdge(vs,i,a);
109 }
110 for(int i1; in; i){
111 scanf(%d,a);
112 addEdge(i,vt,a);
113 }
114 scanf(%d,m);
115 while(m--){
116 scanf(%d%d,a,b);
117 addEdge(a,b,INF);
118 }
119 printf(%d ,ISAP());
120 memset(vis,0,sizeof(vis));
121 printf(%d\n,n-dfs(vs));
122 }
123 return 0;
124 } 转载于:https://www.cnblogs.com/WABoss/p/5335143.html