谨以此祭奠我即将爆炸的NOIP2017.
$Mingqi\_H\ \ 2017.09.24$
Day -47
突然发现半年来自己从来没有写对过SPFA,最近几天才发现自己的板子一直是错的...赶紧找个例题修一下板子:
1 #include<cstring> 2 #include<cstdio> 3 #include<queue> 4 using namespace std; 5 const int maxn = 1e6+10; 6 struct Edge{ 7 int u,v,w; 8 }edge[maxn*2]; 9 int head[maxn]; 10 int cnt; 11 int dis[maxn],vis[maxn]; 12 int m,n; 13 inline void add(int u,int v,int w) 14 { 15 edge[++cnt].u=head[u]; 16 edge[cnt].v=v; 17 edge[cnt].w=w; 18 head[u]=cnt; 19 return; 20 } 21 void spfa(int p) 22 { 23 memset(dis,0x3f,sizeof(dis)); 24 memset(vis,0,sizeof(vis)); 25 int cur,nxt,v; 26 queue<int> q; 27 while(!q.empty()) 28 q.pop(); 29 q.push(p),vis[p]=true; 30 dis[p]=0; 31 while(!q.empty()) 32 { 33 cur=q.front(),q.pop(),vis[cur]=false; 34 for(int i=head[cur];i;i=edge[i].u) 35 { 36 v=edge[i].v; 37 if(dis[p]+edge[v].w<dis[v]) 38 { 39 dis[v]=dis[p]+edge[v].w; 40 q.push(v),vis[v]=true; 41 } 42 } 43 } 44 for(int i=1;i<=m;i++) 45 printf("%d ",dis[i]); 46 printf("\n"); 47 return; 48 } 49 int main() 50 { 51 int u,v,w; 52 scanf("%d%d",&m,&n); 53 for(int i=0;i<n;i++) 54 { 55 scanf("%d%d%d",&u,&v,&w); 56 add(u,v,w); 57 } 58 for(int i=1;i<=m;i++) 59 spfa(i); 60 }
问题:学了这么久了都不会建邻接链表,SPFA加的是点,不是边,链表链表,head数组和edge数组要连起来,第一行是$edge[++cnt].u=head[u];$最后一行是$head[u]=cnt;$永远记住!!!这不是一年前了!!!
你基础不牢啊,吃枣药丸,吃枣药丸,之前还有200多天的时候,你跟现在的水平差不多啊。这100多天你干什么了?!之前不是经常拿到$Rank\ 1$吗?那个你呢?你模拟赛两次四天12道题,分数加起来还没人家一天3道题的多,你会什么啊?会数论吗?之前一直认为自己能拿到$Day2\ T1$的100分,模拟赛那么简单的一道数论题你可是一分都没拿到啊!!!该好好反思一下了!!你不会DP,也就算了,可是你连暴力也不会打,这就说不过去了吧,三四个月前建立的分类,结果到现在也没整理几个题啊,别人的Blogs都有几百道题目了啊!你总共过了有400题吗?!去重之前也仅仅有386道啊!!!还有100多道OJ上的题目,你这一年多干了些什么!
还是从板子开始吧,不能温水煮青蛙了,不能这样下去了。
时间: 2024-11-02 06:20:57