• hdu 1874 畅通工程续(模板题 spfa floyd)


    题目:http://acm.hdu.edu.cn/showproblem.php?pid=1874

    spfa 模板

     1 #include<iostream>
     2 #include<stdio.h>
     3 #include<string.h>
     4 #include<queue>
     5 using namespace std;
     6 
     7 const int INF=1<<28;
     8 int cnt,head[1100],d[210],vis[210],n,m;
     9 queue<int>q;
    10 
    11 struct node
    12 {
    13     int u,v,w,next;
    14 } edge[1100];
    15 
    16 void add(int u,int v,int w)
    17 {
    18     edge[cnt].u=u;
    19     edge[cnt].v=v;
    20     edge[cnt].w=w;
    21     edge[cnt].next=head[u];
    22     head[u]=cnt++;
    23 };
    24 
    25 void spfa(int s)
    26 {
    27     int i,u,v;
    28     for(i=0; i<n; i++)
    29         d[i]=INF;
    30     d[s]=0;
    31 
    32     q.push(s);
    33     vis[s]=1;
    34     while(!q.empty())
    35     {
    36         u=q.front();
    37         q.pop();
    38         vis[u]=0;
    39         for(i=head[u]; i!=-1; i=edge[i].next)
    40         {
    41             v=edge[i].v;
    42             if(d[u]+edge[i].w<d[v])
    43             {
    44                 d[v]=d[u]+edge[i].w;
    45                 if(!vis[v])
    46                 {
    47                     vis[v]=1;
    48                     q.push(v);
    49                 }
    50             }
    51         }
    52     }
    53 };
    54 int main()
    55 {
    56     int u,v,w,s,t;
    57     while(cin>>n>>m)
    58     {
    59         cnt=0;
    60         memset(head,-1,sizeof(head));
    61         memset(vis,0,sizeof(vis));
    62         while(m--)
    63         {
    64             cin>>u>>v>>w;
    65             add(u,v,w);
    66             add(v,u,w);
    67         }
    68         cin>>s>>t;
    69         spfa(s);
    70         if(d[t]<INF) cout<<d[t]<<endl;
    71         else cout<<-1<<endl;
    72     }
    73 }

    floyd 模板

     1 #include <stdio.h>
     2 #include <string.h>
     3 const int oo = 1<<28;
     4 int map[201][201];
     5 
     6 int n, m;
     7 void floyd()
     8 {
     9     int k,i,j;
    10     for( k = 0; k < n; k++)
    11         for( i = 0; i < n; i++)
    12             for( j = 0; j < n; j++)
    13                 if(map[i][k]+map[k][j] < map[i][j])
    14                     map[i][j] = map[i][k]+map[k][j];
    15 }
    16 void init()
    17 {
    18     int i,j;
    19     for( i = 0; i < n; i++)
    20     {
    21         for(j = 0; j < n; j++)
    22             map[i][j] = oo;
    23         map[i][i] = 0;
    24     }
    25 }
    26 int main()
    27 {
    28     int i;
    29     while(~scanf("%d %d", &n, &m))
    30     {
    31         init();
    32         int u, v, w;
    33         for( i = 0; i < m; i++)
    34         {
    35             scanf("%d %d %d", &u, &v, &w);
    36             if(map[u][v] > w)
    37             {
    38                 map[u][v] = w;
    39                 map[v][u] = w;
    40             }
    41         }
    42         floyd();
    43         scanf("%d %d", &u, &v);
    44         if(map[u][v] < oo)
    45             printf("%d
    ", map[u][v]);
    46         else
    47             printf("-1
    ");
    48     }
    49     return 0;
    50 }
  • 相关阅读:
    HTTP浅析
    PHP CURL获取cookies模拟登录
    C++ builder 通过WMI方式修改DNS
    C语言List使用样例
    C语言 获取系统临时目录并获取临时文件名
    C语言 写文件样例
    vb wmi 修改ip地址、网关、DNS
    正则表达式校验IP地址
    c语言 vector使用样例
    C++ builder 通过WMI查询网卡对应的序号
  • 原文地址:https://www.cnblogs.com/bfshm/p/3172551.html
Copyright © 2020-2023  润新知