社区讨论
玄学优化 : 从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分)
CPPfor (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]]);
应该是这样
CPPfor (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 条回复,欢迎继续交流。
正在加载回复...