最短spfa+dijstraスタック最適化の復習

12560 ワード

     ,,   wa   ,,         clear()。。。
spfa bell_forman ( ) ( )
vis vis

, 。 , “ ” , , 。
, , , ( d[] , , ), “ ”
。 , “ ” 。 ?
  Bellman-Ford , ? , Bellman-Ford , |V|-1 。 ,SPFA
“ ”, , SPFA , —— —— |V| , 。(http://www.cnblogs.com/jiangu66/p/3235361.html)


23 ~
void spfa(int s) { int vis[V]; int d[V],ret[V]; for(int i=1;i<=n;i++) d[i]=inf,vis[i]=ret[i]=0; d[s]=0; queue<int> q; q.push(s); ret[s]++; vis[s]=1; while(!q.empty()) { int now=q.front(); q.pop(); vis[now]=0; for(int i=0;i<fuck[now].size();i++) { node temp=fuck[now][i]; if(d[temp.point]>d[now]+temp.cost) { d[temp.point]=d[now]+temp.cost; if(vis[temp.point]==0) { vis[temp.point]=1; ret[temp.point]++; q.push(temp.point); if(ret[temp.point]>V) { cout<1<<endl; return ; } } } } } cout<<d[n]<<endl; } int main() { while(cin>>n>>m) { if(n==0&&m==0) break; for(int i=1;i<=n;i++) fuck[i].clear(); for(int i=1;i<=m;i++) { int x,y,cost; cin>>x>>y>>cost; node temp; temp.cost=cost; temp.point=x; fuck[y].push_back(temp); temp.point=y; fuck[x].push_back(temp); } dijstra(1); //spfa(1); } return 0; }

転載先:https://www.cnblogs.com/z1141000271/p/6517138.html