• HDU 2544 最短路——简单的模板题 dijkstra


      1 #include<cstdio>
      2 #include<cstring>
      3 #include<cstdlib>
      4 
      5 using namespace std;
      6 
      7 const int Max = 100000001;
      8 
      9 struct N
     10 {
     11     int v,w;
     12     N *next;
     13 }*head[110];
     14 
     15 void init(int n)
     16 {
     17     for(int i = 1;i <= n; i++)
     18     {
     19         head[i] = (struct N *)malloc(sizeof(struct N));
     20         head[i]->v = head[i]->w  = -1;
     21         head[i]->next = NULL;
     22     }
     23 }
     24 
     25 void link(int u,int v,int w)
     26 {
     27     N *p1,*p2,*p;
     28     for(p1 = head[u],p2 = head[u]->next; p2 != NULL; p1 = p1->next,p2 = p2->next)
     29     {
     30         if(p2->v == v)
     31         {
     32             if(p2->w > w)
     33                 p2->w = w;
     34             return;
     35         }
     36         if(p1->v < v && v < p2->v)
     37         {
     38             p = (struct N *)malloc(sizeof(struct N));
     39             p->v = v;
     40             p->w = w;
     41             p->next = p1->next;
     42             p1->next = p;
     43             return;
     44         }
     45     }
     46     p = (struct N *)malloc(sizeof(struct N));
     47     p->v = v;
     48     p->w = w;
     49     p->next = NULL;
     50     p1->next = p;
     51     return;
     52 }
     53 
     54 int mark[1000];
     55 
     56 void find(int n)
     57 {
     58     int q[10001],t;
     59     int s,e,i;
     60     for(i = 1;i <= n; i++)
     61         mark[i] = Max;
     62     N *p;
     63     for(s = 0,e = 0,p = head[1]->next; p != NULL; p = p->next)
     64     {
     65         q[e++] = p->v;
     66         mark[p->v] = p->w;
     67        
     68     }
     69     while(s != e)
     70     {
     71         t = q[s];
     72         s++;
     73         for(p = head[t]->next; p != NULL; p = p->next)
     74         {
     75             if(mark[t] + p->w < mark[p->v])
     76             {
     77                 mark[p->v] = mark[t] + p->w;
     78                 q[e++] = p->v;
     79              
     80             }
     81         }
     82     }
     83 }
     84 
     85 int main()
     86 {
     87     int n,m,i,u,v,w,t;
     88     while(scanf("%d %d",&n,&m) != EOF && (m||n) )
     89     {
     90         init(n);
     91         for(i = 0;i < m;i++)
     92         {
     93             scanf("%d %d %d",&u,&v,&w);
     94             link(v,u,w);
     95             link(u,v,w);
     96         }
     97         find(n);
     98         printf("%d\n",mark[n]);
     99     }
    100     return 0;
    101 }
  • 相关阅读:
    Pascal's Triangle II
    Pascal's Triangle
    Best Time to Buy and Sell Stock II
    Best Time to Buy and Sell Stock
    Populating Next Right Pointers in Each Node
    path sum II
    Path Sum
    [转载]小波时频图
    [转载]小波时频图
    [转载]Hilbert变换及谱分析
  • 原文地址:https://www.cnblogs.com/zmx354/p/3041163.html
Copyright © 2020-2023  润新知