最短路练习

Posted flicker-five

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了最短路练习相关的知识,希望对你有一定的参考价值。

9021#1259香甜的黄油

模板题了。稍微有点背景。
很好过,不多说。

给出点权。边权全部为1。求设在哪个牧场,牛的总移动距离最短。

无论是Floyd还是dijistra,都要有一步假设这个牧场为答案进行计算。不算不知道啊,所以几个牧场,几次计算。

对于Floyd,直接计算;对于dijstra,几个牧场,要跑几次单源最短路径,然后计算。

技术分享图片

技术分享图片

 

Floyd            技术分享图片

 

dijstra+堆优化技术分享图片

真是快的一批。。

 

 1 #include <iostream>
 2 #include <cstdio>
 3 #define R register
 4 #define INF 0x7fffffff
 5 using namespace std;
 6 int ans=INF;
 7 int n,p,c,g[810][810],a[510];
 8 inline int ri(){
 9     char c=getchar();int x=0,w=1;
10     while(!isdigit(c)){if(c==-)w=-1;c=getchar();}
11     while( isdigit(c)){x=(x<<3)+(x<<1)+c-48;c=getchar();}
12     return x*w;
13 }
14 int main(){
15     int num,x,y;
16     for(R int i=1;i<=800;++i)
17     for(R int j=1;j<=800;++j)
18         g[i][j]=1000000;
19             
20     for(R int i=1;i<=800;++i)
21         g[i][i]=0;
22             
23     n=ri(),p=ri(),c=ri();
24     for(R int i=1;i<=n;++i)
25         num=ri(),a[num]++;
26             
27     for(R int i=1;i<=c;++i)
28         x=ri(),y=ri(),num=ri(),g[x][y]=g[y][x]=num;
29     
30     for(R int k=1;k<=p;++k)
31     for(R int i=1;i<=p;++i)
32     for(R int j=1;j<=p;++j)   
33         if(g[i][k]+g[k][j]<g[i][j])g[i][j]=g[i][k]+g[k][j];
34       for(R int i=1;i<=p;++i){
35           int tot=0;
36           for(R int j=1;j<=p;++j)tot+=g[i][j]*a[j];
37         ans=min(ans,tot);
38     }
39       printf("%d",ans);
40       return 0;
41 }

 

 

#include <iostream>
#include <cstdio>
#define R register
#define INF 0x7fffffff
using namespace std;
int ans=INF;
int n,p,c,g[810][810],a[510];
inline int ri(){
    char c=getchar();int x=0,w=1;
    while(!isdigit(c)){if(c==-)w=-1;c=getchar();}
    while( isdigit(c)){x=(x<<3)+(x<<1)+c-48;c=getchar();}
    return x*w;
}
int main(){
    int num,x,y;
    for(R int i=1;i<=800;++i)
    for(R int j=1;j<=800;++j)
        g[i][j]=1000000;
            
    for(R int i=1;i<=800;++i)
        g[i][i]=0;
            
    n=ri(),p=ri(),c=ri();
    for(R int i=1;i<=n;++i)
        num=ri(),a[num]++;
            
    for(R int i=1;i<=c;++i)
        x=ri(),y=ri(),num=ri(),g[x][y]=g[y][x]=num;
    
    for(R int k=1;k<=p;++k)
    for(R int i=1;i<=p;++i)
    for(R int j=1;j<=p;++j)   
        if(g[i][k]+g[k][j]<g[i][j])g[i][j]=g[i][k]+g[k][j];
      for(R int i=1;i<=p;++i){
          int tot=0;
          for(R int j=1;j<=p;++j)tot+=g[i][j]*a[j];
        ans=min(ans,tot);
    }
      printf("%d",ans);
      return 0;
}

 

以上是关于最短路练习的主要内容,如果未能解决你的问题,请参考以下文章

牛客练习-凤凰——不同寻常的最短路(找规律求结点数)

最短路练习

专题训练——[kuangbin带你飞]最短路练习

最短路练习 poj1724

kuangbin专题最短路练习

[kuangbin]带你飞之'最短路练习'专题(未完成)