错一堆,红绿交错,太好看了
代码是石山
求调(逻辑有问题?)
Subtask#0 错了 #32 #34 #38 #40 #44 #46
Subtask#1 对了 #3 #5 #7 #9 #16
Subtask#2 只对了 #21
#include<bits/stdc++.h>
using namespace std;
int n,m,k,val[2502],ans;
vector<int> cd[2501],cnc[2501];
queue<int> q;
bool flag[2501];
int f1[2501],f2_1st[2501],f2_2nd[2501],f2_n1st[2501],f2_n2nd[2501],f2_3rd[2501],f2_n3rd[2501];
int main()
{
scanf("%d%d%d",&n,&m,&k);
for(int i = 2;i<=n;i++) scanf("%d",&val[i]);
for(int i = 1;i<=m;i++)
{
int u,v;
scanf("%d%d",&u,&v);
cd[u].push_back(v);
cd[v].push_back(u);
}
//bfs
for(int i = 1;i<=n;i++)
{
while( !q.empty() ) q.pop();
memset(flag,0,sizeof(flag));
q.push(i);
flag[i] = 1;
for(int z = 0;z<=k;z++)
{
int l = q.size();
for(int j = 1;j<=l;j++)
{
for(int a = 0;a<cd[q.front()].size();a++)
{
if(!flag[cd[q.front()][a]])
{
flag[cd[q.front()][a]] = 1;
q.push(cd[q.front()][a]);
cnc[i].push_back(cd[q.front()][a]);
}
}
q.pop();
}
}
}
//贪心1,4
for(int i = 0;i<cnc[1].size();i++) f1[cnc[1][i]] = val[cnc[1][i]];
//贪2,3
for(int i = 2;i<=n;i++) //所有点
{
for(int j = 0;j<cnc[i].size();j++) //所有点的上一可达点
{
int pl = cnc[i][j];
if(f1[pl]!=0)
{
if(f2_1st[pl]<f1[pl]+val[i])
{
f2_3rd[i] = f2_3rd[i];
f2_n3rd[i] = f2_n3rd[i];
f2_2nd[i] = f2_1st[i];
f2_n2nd[i] = f2_n1st[i];
f2_1st[i] = f1[pl]+val[i];
f2_n1st[i] = pl;
}
else if(f2_2nd[pl]<f1[pl]+val[i])
{
f2_3rd[i] = f2_3rd[i];
f2_n3rd[i] = f2_n3rd[i];
f2_2nd[i] = f1[pl]+val[i];
f2_n2nd[i] = pl;
}
else if(f2_3rd[pl]<f1[pl]+val[i])
{
f2_3rd[i] = f1[pl]+val[i];
f2_n3rd[i] = pl;
}
}
}
}
//组合
for(int i = 2;i<=n;i++)
{
for(int j = 0;j<cnc[i].size();j++)
{
int pl = cnc[i][j];
if(pl==1) continue;
int cmi[5] = {0,f2_1st[i],f2_2nd[i],f2_3rd[i]};
int cmj[5] = {0,f2_1st[pl],f2_2nd[pl],f2_3rd[pl]};
int cfi[5] = {0,f2_n1st[i],f2_n2nd[i],f2_n3rd[i]};
int cfj[5] = {0,f2_n1st[pl],f2_n2nd[pl],f2_n3rd[pl]};
for(int k1 = 1;k1<=3;k1++) for(int k2 = 1;k2<=3;k2++) if(cfi[k1]!=cfj[k2]&&cfi[k1]!=pl&&cfj[k2]!=i) ans = max(ans,cmi[k1]+cmj[k2]);
}
}
cout<<ans<<endl;
return 0;
}