...好尴尬啊
我一直以为堆优化是nlogm的,,,甚至还狠狠嘲讽过哪些认为是mlogm的。
上次在cf上被卡了之后才知道自己的dijkstra一直是是写错的。
这次补上正确的模板。。。。
然后又了解到了set优化dijkstra,是nlogn的,很优秀。
1 #include<bits/stdc++.h> 2 using namespace std; 3 const int inf=6205; 4 int n,m,s,t; 5 int tot,fi[inf],nxt[inf<<1],cost[inf<<1],to[inf<<1]; 6 void link(int x,int y,int z){ 7 to[++tot]=y;nxt[tot]=fi[x];fi[x]=tot;cost[tot]=z; 8 } 9 struct dij{ 10 int id,val; 11 bool operator < (const dij &o)const{ 12 return val<o.val; 13 } 14 }; 15 int dis[inf]; 16 set<dij>S; 17 void dijkstra(){ 18 memset(dis,0x3f,sizeof(dis)); 19 dis[s]=0; 20 S.insert((dij){s,0}); 21 while(!S.empty()){ 22 dij u=*S.begin(); 23 S.erase(u); 24 for(int i=fi[u.id];i;i=nxt[i]){ 25 if(dis[to[i]]>dis[u.id]+cost[i]){ 26 if(S.find((dij){to[i],dis[to[i]]})!=S.end())S.erase((dij){to[i],dis[to[i]]}); 27 dis[to[i]]=dis[u.id]+cost[i]; 28 S.insert((dij){to[i],dis[to[i]]}); 29 } 30 } 31 } 32 printf("%d\n",dis[t]); 33 } 34 int main() 35 { 36 freopen("heatwvx.in","r",stdin); 37 freopen("heatwvx.out","w",stdout); 38 scanf("%d%d%d%d",&n,&m,&s,&t); 39 for(int i=1;i<=m;i++){ 40 int x,y,z; 41 scanf("%d%d%d",&x,&y,&z); 42 link(x,y,z);link(y,x,z); 43 } 44 dijkstra(); 45 return 0; 46 }
1 #include<bits/stdc++.h> 2 using namespace std; 3 const int inf=6205; 4 int n,m,s,t; 5 int tot,fi[inf],nxt[inf<<1],cost[inf<<1],to[inf<<1]; 6 void link(int x,int y,int z){ 7 to[++tot]=y;nxt[tot]=fi[x];fi[x]=tot;cost[tot]=z; 8 } 9 struct dij{ 10 int id,val; 11 bool operator < (const dij &o)const{ 12 return val>o.val; 13 } 14 }; 15 int dis[inf]; 16 bool vis[inf]; 17 priority_queue<dij>S; 18 void dijkstra(){ 19 memset(dis,0x3f,sizeof(dis)); 20 dis[s]=0; 21 S.push((dij){s,0}); 22 while(!S.empty()){ 23 dij u=S.top(); 24 S.pop(); 25 if(vis[u.id])continue; 26 vis[u.id]=1; 27 for(int i=fi[u.id];i;i=nxt[i]){ 28 if(dis[to[i]]>dis[u.id]+cost[i]){ 29 dis[to[i]]=dis[u.id]+cost[i]; 30 S.push((dij){to[i],dis[to[i]]}); 31 } 32 } 33 } 34 printf("%d\n",dis[t]); 35 } 36 int main() 37 { 38 freopen("heatwvx.in","r",stdin); 39 freopen("heatwvx.out","w",stdout); 40 scanf("%d%d%d%d",&n,&m,&s,&t); 41 for(int i=1;i<=m;i++){ 42 int x,y,z; 43 scanf("%d%d%d",&x,&y,&z); 44 link(x,y,z);link(y,x,z); 45 } 46 dijkstra(); 47 return 0; 48 }