社区讨论

玄学优化 : 从AC到75

P2935[USACO09JAN] Best Spot S参与者 2已保存回复 3

讨论操作

快速查看讨论及其快照的属性,并进行相关操作。

当前回复
3 条
当前快照
1 份
快照标识符
@mi6xyjxt
此快照首次捕获于
2025/11/20 12:38
4 个月前
此快照最后确认于
2025/11/20 12:38
4 个月前
查看原帖

源代码

CPP
#include <bits/stdc++.h>
using namespace std;

int p,f,c,sum,ansv = INT_MAX,ans,fav[505],req[505][505];

void readdata()
{
	freopen("in.txt","r",stdin);
	scanf("%d%d%d",&p,&f,&c);
	for (int i = 1;i <= f;i++) scanf("%d",&fav[i]);
	for (int i = 1;i <= p;i++)
	{
		for (int j = 1;j <= p;j++) req[i][j] = 2000;
		req[i][i] = 0;
	}
	for (int i = 1;i <= c;i++)
	{
		int a,b,w;
		scanf("%d%d%d",&a,&b,&w);
		req[a][b] = req[b][a] = w;
	}
}

void floyd()
{
	for (int k = 1;k <= p;k++)
		for (int i = 1;i <= p;i++)
			for (int j = 1;j <= f;j++)
				if (k != i && i != fav[j] && fav[j] != k)
					req[i][fav[j]] = min(req[i][fav[j]],req[i][k] + req[k][fav[j]]);
}

void work()
{
	for (int i = 1;i <= p;i++)
	{
		sum = 0;
		for (int j = 1;j <= f;j++) sum += req[i][fav[j]];
		if (ansv > sum) {ansv = sum; ans = i;}
	}
	printf("%d",ans);
}

int main()
{
	readdata();
	floyd();
	work();
	return 0;
}

主要是这里 (75分)

CPP
for (int j = 1;j <= f;j++)
	if (k != i && i != fav[j] && fav[j] != k)
		req[i][fav[j]] = min(req[i][fav[j]],req[i][k] + req[k][fav[j]]);

应该是这样

CPP
for (int j = 1;j <= p;j++)
	if (k != i && i != j && j != k)
		req[i][j] = min(req[i][j],req[i][k] + req[k][j]);

CPP
	我以为只枚举其他牧场到Bessie最喜欢的那几个牧场的最短路就可以了,毕竟O(n^3)的Floyd.
	但是这样就WA3个.实在不知道为什么啊...望神犇赐教,不胜感激.

另外

CPP
	req数组的初始值应该如何取?为什么要req[i][i] = 0呢?

回复

3 条回复,欢迎继续交流。

正在加载回复...