这题数据给的太水了!!!建议加强
查看原帖
这题数据给的太水了!!!建议加强
242478
Qiiiiiii_楼主2020/5/9 19:45
下面这个伪代码竟然过了
#pragma GCC optimize(3)
#include<iostream>
#include<cstdio>
#include<cstring>
#include<algorithm>
#include<queue>
#include<cmath>
#define inf 99999999
#define dl double
#define ll long long
#define max(a,b) ((a)>(b)?(a):(b))
#define min(a,b) ((a)<(b)?(a):(b))
#define abs(a) ((a)>0?(a):-(a))
#define re register
#define FOR(i,a,b) for(re int i=(a) ; i<=(b) ; ++i)
#define AFOR(i,a,b) for(re int i=(a) ; i>=(b) ; --i)
#define REP(i,u) for(re int i=head[u],v=edge[i].to;i!=-1;i=edge[i].nxt,v=edge[i].to)
//#define gc (fs==ft&&(ft=(fs=buf)+fread(buf,1,1<<18,stdin),fs==ft))?0:*fs++
#define gc getchar()
using namespace std;
const int N=1e4+10;
char buf[1<<18],*fs,*ft;
inline ll read() {
	ll w=0,p=0;
	char ch=gc;
	while(!isdigit(ch)) w=ch=='-'?1:0,ch=gc;
	while(isdigit(ch)) p=p*10+ch-'0',ch=gc;
	return w?-p:p;
}
inline void write(ll x) {
	if(x<0) putchar('-'),x=-x;
	if(x>9) write(x/10);
	putchar(x%10+'0');
	return ;
}
struct ao{
	int u,v;
	dl w;
}e[N];
int n,m,rt,cnt;
dl ans;
int fa[N],id[N],top[N],sum[N];
dl val[N];
inline void zhuliu(){
	while(1){
		FOR(i,1,n) id[i]=top[i]=0,val[i]=inf;
		FOR(i,1,m) if(e[i].u!=e[i].v&&val[e[i].v]>e[i].w) fa[e[i].v]=e[i].u,val[e[i].v]=e[i].w;
		 int u=val[rt]=0;
		 FOR(i,1,n) {
		 	ans+=val[i];
			for(u=i;u!=rt&&top[u]!=i&&!id[u];u=fa[u]) top[u]=i;
			if(u!=rt&&!id[u]){
				id[u]=++cnt;
				for(int v=fa[u];v!=u;v=fa[v]) id[v]=cnt;
			}
		}
		if(!cnt) return ;
		FOR(i,1,n) if(!id[i]) id[i]=++cnt;
		FOR(i,1,m){
			dl ww=val[e[i].v];
			if((e[i].u=id[e[i].u])!=(e[i].v=id[e[i].v])) e[i].w-=ww;
		}
		n=cnt,rt=id[rt],cnt=0; 
	}
	return ;
}
inline void work(){
	++n,rt=n;
	FOR(i,1,n-1) e[++m]=(ao){rt,i,val[i]};
	FOR(i,1,m) if(e[i].u!=e[i].v) val[e[i].v]=min(val[e[i].v],e[i].w);
//这里没考虑自环,即忽视了自环的贪心
/*
1
10.00 2
1
1 1 9.00

real ans=19.00
my ans=20.00
连这样的水数据都能卡掉
*/
    FOR(i,1,n-1) ans+=val[i]*(sum[i]-1);
	return ;
}
int main() {
//	freopen("shopping.in","r",stdin);
//	freopen("shopping.out","w",stdout);
	scanf("%d",&n);
	FOR(i,1,n) scanf("%lf%d",&val[i],&sum[i]);
//这里没有考虑sum[i]=0,即不需要的情况,下面的边同样未考虑
	scanf("%d",&m);
	FOR(i,1,m) scanf("%d%d%lf",&e[i].u,&e[i].v,&e[i].w);
	work();
	zhuliu();
	printf("%.2lf",ans); 
	return 0;
}
2020/5/9 19:45
加载中...