sgu438

經典題


然而我因爲i打成j    j打成i   搞了1H

我¥%#¥%


爲何如此心不在焉。。

我明明很專注(吧?)。。。。。


此處不忍吐槽教育

媽的晚一點起牀早一點睡覺不好?


非要23睡 6起  弄的人都是虛的  幹啥都沒精神   還好意思說國民體質不好

感覺自己一天不如一天了。。。

渾身難受


媽呀扯到那裏去了。。


#include <cstdio>
#include <cstring>
#include <iostream>

using namespace std;

int N,M,D,W,T;

int x[55],y[55],c[55];

int h[10100],gap[10100],sz;

int U[2510],V[2510],CNT;

struct edge {
	int v,f,next;
}e[600010];
int head[10100],cnt;

int read_int () {
	char c = getchar();
	int re = 0;
	for(;c > '9' || c < '0';c = getchar());
	for(;c >= '0' && c <= '9';c = getchar())
		re = re * 10 + c - '0';
	return re;
}

void adde (int u,int v,int f) {
	e[cnt].v = v;
	e[cnt].f = f;
	e[cnt].next = head[u];
	head[u] = cnt++;
	
	e[cnt].v = u;
	e[cnt].f = 0;
	e[cnt].next = head[v];
	head[v] = cnt++;
}

int dfs (int u,int minf) {
	if(u == sz + sz + 1)
		return minf;
	
	int chan = sz + sz + 1;
	int leftf = minf;
	
	for(int i = head[u];i != -1;i = e[i].next) {
		int v = e[i].v;
		
		if(e[i].f) {
			if(h[v] == h[u] - 1) {
				int t = dfs(v,min(e[i].f,leftf));
				e[i].f -= t;
				e[i ^ 1].f += t;
				leftf -= t;
				
				if(h[0] >= sz + sz + 2)
					return minf - leftf;
				if(!leftf)
					break;
			}
			chan = min(chan,h[v]);
		}
	}
	
	if(leftf == minf) {
		if(--gap[h[u]] == 0)
			h[0] = sz + sz + 2;
		++gap[h[u] = chan + 1];
	}
	return minf - leftf;
}

bool sap () {
	cnt = 0;
	memset(head,-1,sizeof head);
	sz = T * N;
	for(int i = 1;i <= T;++i) {
		for(int j = 1;j <= N;++j) {
			if(y[j] <= D)
				adde(0,j + (i - 1) * N,0x3f3f3f3f);
		}
	}
	for(int i = 1;i <= T - 1;++i) {
		for(int j = 1;j <= CNT;++j) {
			adde(U[j] + (i - 1) * N + sz,V[j] + i * N,0x3f3f3f3f);
			adde(V[j] + (i - 1) * N + sz,U[j] + i * N,0x3f3f3f3f);
		}
	}
	for(int i = 1;i <= T;++i) {
		for(int j = 1;j <= N;++j) {
			adde(j + (i - 1) * N,j + (i - 1) * N + sz,c[j]);
		}
	}
	for(int i = 1;i <= T;++i) {
		for(int j = 1;j <= N;++j) {
			if(W - y[j] <= D)
			adde(j + (i - 1) * N + sz,sz + sz + 1,0x3f3f3f3f);
		}
	}
	int re = 0;
	memset(gap,0,sizeof gap);
	memset(h,0,sizeof h);
	gap[0] = sz + sz + 2;
	while(h[0] < sz + sz + 2)
		re += dfs(0,0x3f3f3f3f);
	if(re >= M)
		return 1;
	return 0;
}

int main () {
	N = read_int();
	M = read_int();
	D = read_int();
	W = read_int();
	
	for(int i = 1;i <= N;++i) {
		x[i] = read_int();
		y[i] = read_int();
		c[i] = read_int();
	}
	for(int i = 1;i <= N - 1;++i) {
		for(int j = i + 1;j <= N;++j) {
			if((x[i] - x[j]) * (x[i] - x[j]) + (y[i] - y[j]) * (y[i] - y[j]) <= D * D) {
				U[++CNT] = i;
				V[CNT] = j;
			}
		}
	}
	if(D >= W) {
		printf("1\n");
		return 0;
	}
	
	for(int i = 1;i <= 100;++i) {
		T = i;
		if(sap()) {
			printf("%d\n",i + 1);
			return 0;
		}
	}
	printf("IMPOSSIBLE\n");
}


發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章