rt,不太会调这个东西,一直稳定在 51 pts 左右,是我写挂了还是参数没调对
#include<bits/stdc++.h>
#define ll long long
#define N 100005
#define inf 0x3f3f3f3f
using namespace std;
int read(){
int x=0,f=1;char ch=getchar();
while(ch<'0' || ch>'9')f=(ch=='-'?-1:f),ch=getchar();
while(ch>='0' && ch<='9')x=(x<<1)+(x<<3)+(ch^48),ch=getchar();
return x*f;
}
void write(int x){
if(x<0)x=-x,putchar('-');
if(x/10)write(x/10);
putchar(x%10+'0');
}
struct Node{
int v,w;
Node(int v=0,int w=0):v(v),w(w){}
bool operator <(const Node &x)const{
return w>x.w;
}
};
vector<Node> e[N];
int dis[N],n,m,k,vis[N],cas[N];
int num[N],nod[N],q[N],cnt,ans=inf;
priority_queue<Node> Q;
mt19937 myrand(19260817);
void dij(){
for(int i=1;i<=n;i++)dis[i]=inf,vis[i]=0;
for(int i=1;i<=m;i++)dis[cas[i]]=0,Q.push(Node(cas[i],0));
for(int i=1;i<=k;i++)dis[q[i]]=0,Q.push(Node(q[i],0));
while(Q.size()){
int u=Q.top().v;Q.pop();
if(vis[u])continue;vis[u]++;
for(auto son:e[u]){
int v=son.v,w=son.w;
if(dis[v]>dis[u]+w){
dis[v]=dis[u]+w;Q.push(Node(v,dis[v]));
}
}
}
// cerr<<q[2]<<' '<<q[1]<<endl;
// for(int i=1;i<=n;i++)cerr<<dis[i]<<' ';
// cerr<<endl;
}
void simulate_anneal(){
int res=inf;
for(double temp=1000;temp>1e-10;temp*=0.993){
int u=myrand()%(cnt-k)+1+k,v=myrand()%k+1;
swap(q[u],q[v]);dij();
int nowres=-1;
for(int i=k+1;i<=cnt;i++)nowres=max(nowres,dis[q[i]]);
double delta=nowres-res;
if(delta>0 || exp(-delta*1.0/temp)>myrand()*1.0/RAND_MAX);
else swap(q[u],q[v]);
ans=min(ans,nowres);
}
}
int main(){
#ifdef EAST_CLOUD
freopen("a.in","r",stdin);
freopen("a.out","w",stdout);
#endif
int st=clock();srand(time(0));
n=read(),m=read(),k=read();
for(int i=1;i<=n;i++){
int x=read();x++;nod[i]=x;
e[x].push_back(Node(i,0));e[i].push_back(Node(x,0));
}
for(int i=1;i<=n;i++){
int w=read();e[i][num[i]].w=w;
e[nod[i]][num[nod[i]]].w=w;num[i]++;num[nod[i]]++;
}
for(int i=1;i<=m;i++)cas[i]=read(),vis[cas[i]]++;
for(int i=1;i<=n;i++)if(!vis[i])q[++cnt]=i;
if(cnt==k){cout<<0;return 0;}
while((clock()-st)*1.0/CLOCKS_PER_SEC<0.74)simulate_anneal();
cout<<ans;
return 0;
}