#include<stdio.h>
#include<stdlib.h>
#include<math.h>
#include<stdbool.h>
long a[500] = { 0 };
long b[500] = { 0 };
bool relate[500][500] = { 0 };
long pi[500] = { 0 };
long f1[500] = { 0 };
long f2[500] = { 0 };\\用long是之前排错的时候设置的,好像没太大影响
int n, m;
bool pan1(int k)
{
for (int i = 1; i <= n; ++i)
{
if (k == pi[i])
{
return 0;
}
}
return 1;
}\\判断该点是否被拆除
bool pan(int k)
{
int y = 0;
for (int i = 1; i <= n; ++i)
{
if (relate[k][i] == 1 || relate[i][k] == 1)
{
++y;
}
}
if (y >= 2)
{
return 0;
}
else
{
return 1;
}
}\\判断该点连接了几个点,如果>=两个,则不能拆除,如果只有一个则拆除
int maxbi()
{
double a1, a2;
int y, a3;
a3 = 0;
for (int i = 1; i <= n; ++i)
{
if (pan1(i) && pan(i))
{
a1 = (float)a[i] / b[i];
a3 = i;
break;
}
}
for (int i = 1; i <= n; ++i)
{
a2 = (float)a[i] / b[i];
if (a1 >= a2 && pan(i) && pan1(i))
{
a1 = a2;
a3 = i;
}
}
return a3;
}\\寻找 总产量/总污染 最小的点
int main()
{
int i1 = 0, i2 = 0, max1;
scanf("%d %d", &n, &m);
for (int i = 1; i <= n; ++i)
{
scanf("%d", &a[i]);
f1[0] = f1[0] + a[i];
}
for (int i = 1; i <= n; ++i)
{
scanf("%d", &b[i]);
f2[0] = f2[0] + b[i];
}
for (int i = 1; i <= n - 1; ++i)
{
scanf("%d %d", &i1, &i2);
relate[i1][i2] = 1;
}\\输入数据
for (int i = 1; i <= m; ++i)
{
max1 = maxbi();
f1[i] = f1[i - 1] - a[max1];
f2[i] = f2[i - 1] - b[max1];\\状态转移方程
a[max1] = 0;
pi[i] = max1;
for (int j = 1; j <= n; ++j)
{
relate[j][max1] = relate[max1][j] = 0;\\拆除的点的连接归零
}
}
printf("%0.1f", (float)f1[m] / f2[m]);\\输出 总产量/总污染
}```