模拟退火求助
查看原帖
模拟退火求助
375422
MUUQ7ING楼主2022/3/2 17:15

QWQ人麻了

#include<bits/stdc++.h>
#include<cstdlib>
#define int long long
#define db double
#define dw 0.998
#define For(i,a,b) for(int i(a);i<=b;++i)
#define foR(i,a,b) for(int i(a);i>=b;--i)
using namespace std;
inline void read(int &x){
	x=0;char ch;bool w=0;ch=getchar();
	while(ch<'0'||ch>'9'){if(ch=='-')w=1; ch=getchar();}
	while(ch>='0'&&ch<='9'){x=x*10+ch-'0';ch=getchar();}
	if(w)x=-1*x;
}
inline void print(int x){
	if(x<0){putchar('-');print(-x);return ;}
	if(x>9)print(x/10);putchar(x%10+'0');
}
const int N=167,inf=0x3f3f3f3f;
int n,m,k,r[N],Head[N],To[N],Next[N],Val[N],cnt;
int dis[N],cg[N],nm[N],ans;
bool vis[N],c[N],nc[N];
void add(int x,int y,int z){
	Next[++cnt]=Head[x];Head[x]=cnt;To[cnt]=y;Val[cnt]=z;
}
priority_queue< pair<int,int> > q;
void dij(){
	memset(dis,0x3f,sizeof dis);
	memset(vis,0,sizeof vis);
	For(i,1,n)if(c[i]||nc[i])
	dis[i]=0,q.push(make_pair(0,i));
	while(!q.empty()){
		int x=q.top().second;q.pop();
		if(vis[x])continue;
		vis[x]=1;
		for(int i=Head[x];i;i=Next[i]){
			int y=To[i];
			if(dis[y]>dis[x]+Val[i]){
				dis[y]=dis[x]+Val[i];
				q.push(make_pair(-dis[y],y));
			}
		}
	}
}
int random(int l,int r){
	return rand()%(r-l+1)+l;
}
int l[N];
int HQ(){
	int qwq=0;
	dij();
	For(i,1,n)qwq=max(qwq,dis[i]);
	return qwq;
}
void SA(){
	db t=4040;int x,y;
	while(t>1e-15)
	{
//		cout<<"!"<<t<<endl;
		x=random(1,k);//cg
		y=random(1,n-k-m);//nm
		nc[cg[x]]=0;nc[nm[y]]=1;
		swap(cg[x],nm[y]);
		
		int ne=HQ();
		if(ne-ans<0){
			ans=ne;
		}
		else {
			if(exp((db)(ans-ne)/t)*RAND_MAX<=rand());
			else{
				swap(cg[x],nm[y]);
				nc[cg[x]]=1;nc[nm[y]]=0;
			}
		}
		t*=dw;
	}
}
signed main(){
	srand(time(0));
	read(n);read(m);read(k);
	For(i,1,n){
		read(r[i]);r[i]++;
	}
	For(i,1,n){
		int d;
		read(d);
		add(i,r[i],d);add(r[i],i,d);
	}
	For(i,1,m){
		int x;read(x);x++;
		c[x]=1;
	}
	ans=HQ();
	if(m+k>=n){cout<<0;return 0;}
	if(k==0){print(ans);return 0;}
	
	int x=0,y=0;
	For(i,1,n){
		if(!c[i]){
			if(x<k)cg[++x]=i,nc[i]=1;
			else  nm[++y]=i;
		}
	}
	ans=HQ();
	while((double)clock()<CLOCKS_PER_SEC<=0.6)
	SA();
	print(ans);return 0;
}
2022/3/2 17:15
加载中...