syf2008 @ 2022-02-12 10:01:59
这道题目是图论+二分答案,而spfa的极限复杂度是
通过网上随便找的卡spfa数据生成器(加上我修改成符合题目的输入),spfa挂了,本地DEV 10s+
#include <bits/stdc++.h>
using namespace std;
struct edge
{
int u, v, w;
};
vector<edge>v;
int id[5000][5000],n=100,tp,m=10000/n,a[1000000];
int r()
{
return rand();
}
int main()
{
freopen("spfa1.in","w",stdout);
srand(time(0));
for(int i=1;i<=n;++i)
for(int j=1;j<=m;++j)
id[i][j]=++tp,a[tp]=tp;
int SIZE=29989;
for(int i=1;i<=n;++i)
for(int j=1;j<=m;++j)
{
if(i<n)
{
v.push_back(edge{id[i][j],id[i+1][j],1});
v.push_back(edge{id[i+1][j],id[i][j],1});
if(j<m)
{
if(1)
v.push_back(edge{id[i][j],id[i+1][j+1],r()%SIZE+10});
else v.push_back(edge{id[i+1][j+1],id[i][j],r()%SIZE+10});
}
}
if(j<m)
{
v.push_back(edge{id[i][j],id[i][j+1],r()%SIZE+10});
v.push_back(edge{id[i][j+1],id[i][j],r()%SIZE+10});
}
}
fprintf(stderr,"[%d,%d,%d]",v.size(),n,m);
random_shuffle(v.begin(),v.end());
printf("%d %d 1000000000\n",tp,v.size());
for(int i=1;i<=tp;i++)
if(i==1||i==tp)
printf("%d ",1);
else if(i==2)
printf("%d ",1000000000);
else printf("%d ",i);
printf("\n");
for(int i=0;i<v.size();++i)
printf("%d %d %d\n",a[v[i].u],a[v[i].v],v[i].w);
}
@WYXkk
by yzy1 @ 2022-02-12 10:38:28
更加离谱的是,这题题目标签里至今还有一个「SPFA」
by henryhu2006 @ 2022-02-12 10:41:12
@syf0 USACO 20 Feb Gold Timeline
也许洛谷可以过,但是赛时在 usaco 上是会被卡常的
by henryhu2006 @ 2022-02-12 10:43:08
估计就是出题人偷懒写 spfa,数据又随机,然后“不经意”就把 Dij 卡掉了
by StayAlone @ 2022-02-12 10:48:11
无法理解spfa卡dij
@syf0 如果题面中保证数据随机也许可以这样
by Celtic @ 2022-02-12 11:26:29
@henryhu2006 毕竟spfa O(km) 吊打 dij O(m log n)
by syf2008 @ 2022-02-14 08:01:44
@StudyingFather
by syf2008 @ 2022-02-19 13:14:54
@wlzhouzhuan
by syf2008 @ 2022-02-25 18:41:32
@小粉兔
by 鏡音リン @ 2022-03-28 22:50:24
我觉得这种不应该撤下吧。。。。
by syf2008 @ 2022-03-29 19:59:48
@鏡音リン 为什么?spfa时间复杂度是错的呀,不然NOI2018归程中spfa咋死的(雾