这个题目的题意大概是,曹操和袁绍打仗,一共有M个战场,和N个村庄。对于每个战场重要值为2的战场必须赢,重要值为1的战场不能输,重要值为0的战场无所谓。赢得方式是对于一个战场,曹操人数的数量大于袁绍人数的数量。对于每个村庄曹操可以用ci每一个兵的钱,让所买的兵加入ai战场,同时也会有同等数量的兵加入袁绍所在的bi战场。假设我们一开每个战场双方的人数都是0,那么对于要赢的战场要保证曹操的人数比袁绍的人数多一个就可以了。因为每个村庄派出的人数是相等的。所以战场上双方总人数是相等的。但是要赢的战场人要多,那么只有可以输的战场人是少的。那么对于每个村庄派出去的人可以看成是从bi战场调用一个人去ai战场花费了ci。重要值为0的战场可以被调兵。所以就跑一个多源最短路,求出所有重要值为2的点的最小费用。对于重要值为1的战场,我们可以当成有兵经过这里或者没有经过这里。所以最后累加答案时只需累加重要值为2的战场。
对于这幅图 三角形的是村庄,与他相连的两条边的战场。正方形的是重要值为2的,圆形的重要值为0的;
我们可以看成圆形的连了一条有向边到正方形。
#include<iostream>
#include<cstdio>
#include<cstring>
#include<algorithm>
#include<vector>
#include<queue>
using namespace std;
const int maxx = 1e5 + 5;
#define inf 1e18
typedef long long LL;
struct node
{
int to, value;
bool operator<(const node &a)
{
return value > a.value;
}
};
vector<node>edge[maxx];
LL dis[maxx];
bool vis[maxx];
int n, m;
int a[maxx], b[maxx], c[maxx], d[maxx];
void addedge(int aa, int bb, int cc)
{
edge[aa].push_back(node{ bb,cc });
}
LL spfa()
{
queue<int> qu;
for (int i = 1; i <= m; i++)
{
if (d[i] == 0)
{
dis[i] = 0;
vis[i] = 1;
qu.push(i);
continue;
}
dis[i] = inf;
vis[i] = 0;
}
while (!qu.empty())
{
int now = qu.front(); qu.pop();
vis[now] = 0;
for (int i = 0; i < edge[now].size(); i++)
{
int nex = edge[now][i].to;
LL need = edge[now][i].value + dis[now];
if (need < dis[nex])
{
dis[nex] = need;
if (!vis[nex])
{
qu.push(nex);
vis[nex] = 1;
}
}
}
}
LL res = 0;
for (int i = 1; i <= m; i++)
{
if (d[i] == 2)
{
if (dis[i] != inf)
res += dis[i];
else
return -1;
}
}
return res;
}
int main()
{
int t, cnt = 1;
scanf("%d", &t);
while (t--)
{
scanf("%d%d", &n, &m);
for (int i = 1; i <= m; i++)
edge[i].clear();
for (int i = 1; i <= n; i++)
scanf("%d", &a[i]);
for (int i = 1; i <= n; i++)
scanf("%d", &b[i]);
for (int i = 1; i <= n; i++)
scanf("%d", &c[i]);
for (int i = 1; i <= m; i++)
scanf("%d", &d[i]);
for (int i = 1; i <= n; i++)
addedge(b[i], a[i], c[i]);
LL ans = spfa();
printf("Case #%d: %lld\n", cnt++, ans);
}
return 0;
}
本人愚见,如有不足,欢迎指点
本文介绍了一个基于图论的策略算法问题,曹操与袁绍交战,通过村庄派遣兵力到不同战场,确保重要战场胜利的同时使总花费最小。采用多源最短路径算法解决兵力调配问题。
441

被折叠的 条评论
为什么被折叠?



