【bzoj1092】蜘蛛难题 模拟

       直接按时间模拟,先把能流到的求出来,然后把最低的都添加1流量。(不知道为什么以前一直没有人做?)

AC代码如下:

#include<iostream>
#include<cstdio>
#include<cstring>
#define N 205
using namespace std;

int n,m,gol,tal,tot,fst[N],pnt[N],len[N],nxt[N],x[N],y[N],h[N];
bool bo[N];
int find(int t){
	int i; for (i=1; i<=n; i++) if (x[i]==t) return i;
}
void add(int x,int y,int z){
	pnt[++tot]=y; len[tot]=z; nxt[tot]=fst[x]; fst[x]=tot;
}
int main(){
	scanf("%d",&n); int i;
	for (i=1; i<=n; i++){
		scanf("%d%d%d",&x[i],&y[i],&h[i]); h[i]+=y[i];
	}
	bo[1]=1;
	scanf("%d",&m);
	for (i=1; i<=m; i++){
		int u,v,w; scanf("%d%d%d",&u,&v,&w);
		w=find(u+w); u=find(u-1);
		add(u,w,v); add(w,u,v);
	}
	scanf("%d%d",&gol,&tal); int ans=0;
	while (1){
		bool flag=1;
		while (flag){
			flag=0; int p;
			for (i=1; i<=n; i++) if (bo[i])
				for (p=fst[i]; p; p=nxt[p])
					if (h[i]<=len[p] && !bo[pnt[p]])
						bo[pnt[p]]=flag=1;
		}
		m=0;
		for (i=1; i<=n; i++) if (bo[i])
			m=max(m,h[i]);
		if (bo[gol] && m==tal){ printf("%d\n",ans); return 0; }
		for (i=1; i<=n; i++)
			if (bo[i] && h[i]==y[i] && m==y[i]){ puts("-1"); return 0; }
		for (i=1; i<=n; i++)
			if (bo[i] && h[i]==m){ h[i]--; ans++; }
	}
	return 0;
}


by lych

2016.3.4

你可能感兴趣的:(模拟)