图论复习1,贴几个求单源最短路的模板

来源:互联网 发布:java rar 解压 编辑:程序博客网 时间:2024/06/05 08:02
  1. 最短路(Dijkstra+Priority_queue+邻接表)
  2. struct NODE
  3. {
  4.     int to;
  5.     int len;
  6.     bool operator<(const NODE& cmp ) const{return cmp.len<len;}
  7. };
  8. void dijkstra(int n,vector<NODE> buf[],int s,int* min)
  9. {
  10.     int i;
  11.     NODE v;
  12.     for (i=0;i<n;i++)
  13.         min[i]=INF,vis[i]=false;
  14.     for ( i=0 ; i<buf[s].size() ; i++ )
  15.     {
  16.         min[buf[s][i].to]=buf[s][i].len;
  17.         que.push(buf[s][i]);
  18.     }
  19.     vis[s]=true;
  20.     while  (!que.empty())
  21.     {
  22.         v=que.top();que.pop();vis[v.to]=true;
  23.         for ( i=0 ; i<buf[v.to].size() ; i++ )
  24.             if ( !vis[buf[v.to][i].to] && min[buf[v.to][i].to]>min[v.to]+buf[v.to][i].len )
  25.             {
  26.                 que.push(buf[v.to][i]);
  27.                 min[buf[v.to][i].to]=min[v.to]+buf[v.to][i].len;
  28.             }
  29.     }
  30. }
  31. 最短路(SPFA+正向表)
  32. Const int INF = 1000000000;
  33. struct NODE
  34. {
  35.     int to;
  36.     int len;
  37.     struct NODE *next;
  38. };
  39. void SPFA( NODE* mat[] , int P , int s , int dis[] )
  40. {
  41.     int i,x,head,tail;
  42.     NODE* tp;
  43.     for(i=0;i<P;i++) 
  44.         dis[i]=INF;
  45.     for ( i=0 ; i<P ; i++ )
  46.         inqueue[i]=false;
  47.     dis[s]=0;
  48.     head=tail=0;
  49.     que[tail++]=s;
  50.     inqueue[s]=true;
  51.     while(head<tail)
  52.     {
  53.         x=que[head++];
  54.         inqueue[x]=false;
  55.         for( tp=mat[x] ; tp ; tp=tp->next )
  56.             if( dis[tp->to] > dis[x]+tp->len )
  57.             {
  58.                 dis[tp->to]=dis[x]+tp->len;
  59.                 if(!inqueue[tp->to])
  60.                 {
  61.                     que[tail++]=tp->to;
  62.                     inqueue[tp->to]=true;
  63.                 }
  64.             } 
  65.     }
  66. }

第二个SPFA是从网上找来的,然后我自己修改了一下,因为做了poj1511,所以把邻接表用前向星的形式写了,题目中的数据大的变态。。。1<=V,E<=1000000,建议都开成全局变量,然后尽量少用形参。

但是一般情况下,用vector表示邻接表方便点。