HUST1024二分答案+最大流

HUST1024 dance party

题意:N个男孩和N个女孩要开个跳舞party,把愿意一块跳舞的男孩女孩的编号给出,男孩女孩最多和K个不喜欢的女孩男孩跳舞,问最多举行几轮(每一轮的舞伴不同)

解析:拆点,二分答案—建图:源点到男孩1的边容量为二分的值,女孩1到汇点的边容量为二分的值,男孩1到喜欢女孩1的边容量为1,男孩1到男孩2的边容量为k,男孩2到不喜欢女孩2的边容量为1,女孩2到女孩1的边容量为k,求最大流
#include <cstdio>
#include <cstring>
#define INF 0x3f3f3f3f
#define max(a,b) (a) > (b) ? (a) : (b)
#define min(a,b) (a) < (b) ? (a) : (b)
using namespace std;

const int MAXN = 500;
struct Edge{
		int v,cap,next;
		Edge(){}
		Edge(int _v,int _cap,int _next):v(_v),cap(_cap),next(_next){}
}edge[2*MAXN*MAXN];
int n,m;
int head[MAXN],size;
int h[MAXN],agree[MAXN][MAXN];
int N,M,K,src,sink;
inline void init(){
		size = 0;
		memset(head,-1,sizeof(head));
}
inline void add_edge(int u,int v,int x){
		edge[size] = Edge(v,x,head[u]);
		head[u] = size++;
		edge[size] = Edge(u,0,head[v]);
		head[v] = size ++;
}
inline int BFS(){
		int tou,tail;
		int u,v,w,tep;
		int que[MAXN];
		memset(h,-1,sizeof(h));
		h[src] = 0;
		tou = tail = 0;
		que[tail++] = src;
		while (tail > tou){
				u = que[tou++];
				for(int i = head[u]; i != -1; i = edge[i].next){
						v = edge[i].v;
						w = edge[i].cap;
						if (h[v] == -1 && w > 0){
								h[v] = h[u] + 1;
								que[tail++] = v;
						}
				}
		}
		return h[sink] != -1;
}
inline int DFS(int u,int flow){

		if(u == sink)return flow;
		int i,tmpf,minf,v,w;
		tmpf = 0;
		for(i = head[u]; i != -1; i = edge[i].next){
				v = edge[i].v;
				w = edge[i].cap;
				if(h[v] == h[u] + 1 && w > 0 && tmpf < flow && (minf = DFS(v,min(w,flow-tmpf)))){
						edge[i].cap -= minf;
						if(i%2 == 0)edge[i+1].cap += minf;
						else edge[i-1].cap += minf;
						tmpf += minf;
				}
		}
		if(tmpf == 0)h[u] = -1;
		return tmpf;
}
inline int dinic(){
		int t,ans = 0;
		while (BFS()){
				while (t = DFS(src,INF))ans += t;
		}
		return ans;
}

inline bool check(int mid){
		init();
		for(int i = 1; i <= n; ++i)add_edge(src,i,mid);
		for(int i = 1; i <= n; ++i)add_edge(3*n+i,sink,mid);
		for(int i = 1; i <= n; ++i)add_edge(i,n+i,K);
		for(int i = 1; i <= n; ++i)add_edge(i+2*n,i+3*n,K);

		for(int i = 1; i <= n; ++i)
				for(int j = 1; j <= n; ++j){
						if(agree[i][j]){
								add_edge(i,3*n+j,1);
						}
						else	add_edge(i+n,2*n+j,1);
						
				}
		
		if(dinic() >= n*mid){
				return true;
		}
		else return false;

}
					
inline int solve(){
		int high = n,low = 0;
		int mid;
		while (low <= high){
				mid = (low+high)/2;
				if(check(mid))low = mid + 1;
				else high = mid - 1;
		}
		return high;
}
int main(){
		int cas;
		scanf("%d",&cas);
		while (cas --){
				scanf("%d%d%d",&n,&m,&K);
				int a,b,c;
				src = 0;sink = 4*n + 1;
				N = 4*n + 2;
				memset(agree,0,sizeof(agree));
				while (m --){
						scanf("%d%d",&a,&b);
						agree[a][b]  = 1;
				}
				int ans = solve();
				printf("%d\n",ans);
		}
		return 0;
}


  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
MIPS流水线CPU设计是指在MIPS指令集架构下,通过流水线技术来提高CPU的运算效率。华中科技大学(HUST)的答案是: 首先,MIPS流水线CPU设计必须考虑到指令的处理过程。在MIPS架构中,指令被分为取指令、译码、执行、访存和写回这五个阶段。因此,在流水线CPU设计中,需要将这些阶段连接起来,使得每个时钟周期都能完成一个指令的处理过程。 其次,流水线CPU设计需要考虑到数据相关性和控制相关性。数据相关性是指指令之间存在的数据依赖关系,需要通过前推、延迟槽等技术来解决;控制相关性是指指令之间存在的控制流依赖关系,需要通过分支预测、静态调度等技术来解决。 另外,MIPS流水线CPU设计还需要考虑到冲突处理和异常处理。冲突处理是指当流水线上出现数据冲突、控制冲突或结构冲突时,需要采用暂停、插入气泡或乱序发射等技术来解决;异常处理是指当指令执行过程中出现异常情况时,需要保存现场、跳转异常处理程序等技术来解决。 综上所述,MIPS流水线CPU设计需要综合考虑指令处理、数据相关性、控制相关性、冲突处理和异常处理等多方面的因素,才能设计出高效、稳定的流水线CPU。华中科技大学的答案是在此基础上,采用了一系列创新的技术和方法,使得其MIPS流水线CPU设计达到了较高的性能和可靠性。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值