思路:首先每次曹操从一个村庄调用一个兵到战场xi时,其实相当于同时往yi战场减少一个兵,如果yi战场的价值度是0的话那么是无所谓的,如果价值是2的话,那么这减少的一个兵你就要通过其他村庄转移来填补这一个减少的兵,否则就会输掉,那么这样一直转移到一个无用的战场,那么就可以满足条件了,所以按照这样建图然后跑一次最短路那么就是最少费用了(一开始以为是网络流什么的...大概数据范围也透露了一点...)
#include<bits/stdc++.h>
using namespace std;
#define LL long long
const int maxn = 100000+500;
int n,m;
#define INF 1LL<<38
int x[maxn],y[maxn],p[maxn],inq[maxn];
LL c[maxn],d[maxn];
vector<pair<int,LL> >e[maxn];
int main()
{
int T,cas=1;
scanf("%d",&T);
while(T--)
{
memset(d,0,sizeof(d));
scanf("%d%d",&n,&m);
for(int i = 0;i<=n;i++)
e[i].clear();
for(int i = 1;i<=n;i++)
scanf("%d",&x[i]);
for(int i = 1;i<=n;i++)
scanf("%d",&y[i]);
for(int i = 1;i<=n;i++)
scanf("%lld",&c[i]);
for(int i = 1;i<=m;i++)
scanf("%d",&p[i]);
for(int i = 1;i<=n;i++)
{
if(p[x[i]]==0)continue;
e[y[i]].push_back(make_pair(x[i],c[i]));
}
queue<int>q;
for(int i = 1;i<=m;i++)
{
if(p[i]==0)
{
q.push(i);
inq[i]=1;
d[i]=0;
}
else
{
d[i]=INF;
inq[i]=0;
}
}
while(!q.empty())
{
int u = q.front();
q.pop();
inq[u]=0;
for(int i = 0;i<e[u].size();i++)
{
int v = e[u][i].first;
if(d[v]>d[u]+e[u][i].second)
{
d[v]=d[u]+e[u][i].second;
if(inq[v])
continue;
inq[v]=1;
q.push(v);
}
}
}
LL ans = 0;
int flag = 0;
for(int i = 1;i<=m;i++)
{
if(p[i]==2)
{
if(d[i]==INF)
{
flag = 1;
break;
}
ans+=d[i];
}
}
printf("Case #%d: ",cas++);
if(flag)
printf("-1\n");
else
printf("%lld\n",ans);
}
}