USACO--3.2Sweet Butter+推优化的Dijkstral算法

这个题目思路是很简单的,我们只需要枚举每个顶点作为目的地,然后再取其中距离总和最小的作为答案.开始的时候我用的是floyd一次就将所有点之间的最小距离求出来,但是超时了.

后面每次枚举一个点就用堆优化的dijkstral求一次这个点到其余点的最短路,这样就可以过了.算法中还用数组模拟了图的邻接矩阵.

代码如下:

/*
ID: 15674811
LANG: C++
TASK: butter
*/

#include<iostream>
#include<cstdio>
#include<cstring>
#include<queue>
using namespace std;

#define maxn 810
#define INF 0x3f3f3f3f

int p[maxn],d[maxn],first[maxn],vis[maxn];
int u[maxn*10],v[maxn*10],w[maxn*10],next[maxn*10];
int e,n,k,m;;

void add_e(int x,int y,int z)
{
       u[e]=x; v[e]=y; w[e]=z;
       next[e]=first[x];
       first[x]=e++;
}

typedef pair<int,int>pii;
priority_queue<pii,vector<pii>,greater<pii> >q;

void dijkstral(int x)
{
      memset(vis,0,sizeof(vis));
      memset(d,0x3f,sizeof(d));
      d[x]=0;
      q.push(make_pair(d[x],x));
      while(!q.empty())
      {
            pii u=q.top(); q.pop();
            int x=u.second;
            if(vis[x]) continue;
            vis[x]=1;
            for(int k=first[x];k!=-1;k=next[k])
                 if(d[v[k]]>d[x]+w[k])
                 {
                      d[v[k]]=d[x]+w[k];
                      q.push(make_pair(d[v[k]],v[k]));
                 }
      }
}

int main()
{
       freopen("butter.in","r",stdin);
       freopen("butter.out","w",stdout);
       //freopen("in.txt","r",stdin);
       int sum=INF;
      scanf("%d%d%d",&k,&n,&m);
      for(int i=0;i<k;i++)
           scanf("%d",&p[i]);
      e=0;
      for(int i=1;i<=n;i++)
           first[i]=-1;
      for(int i=1;i<=m;i++)
      {
             int x,y,z;
             scanf("%d%d%d",&x,&y,&z);
             add_e(x,y,z);
             add_e(y,x,z);
      }
      for(int i=1;i<=n;i++)
      {
            dijkstral(i);
            int tmp=0,j;
            for(j=0;j<k;j++)
            {
                  if(d[p[j]]>=INF)
                      break;
                  tmp+=d[p[j]];
            }
            if(j>=k&&sum>tmp)
                sum=tmp;
      }
     printf("%d\n",sum);
   return 0;
}
时间: 2024-10-21 08:24:18

USACO--3.2Sweet Butter+推优化的Dijkstral算法的相关文章

图论之最短路径(3)队列优化的Bellman-Ford算法(SPFA算法)

在Bellman-Ford算法中 我们可以看到大量的优化空间:如果一个点的最短路径已经确定了,那么它就不会再改变,因此不需要再处理.换句话说:我们每次只对最短路径改变了的顶点的所有出边进行操作 使用一个队列就可以实现这个“轮流处理“的效果: 具体操作:选取一个顶点,入队,枚举它的出边,进行松弛,把松弛后最短距离改变的点入队,然后将最初选取的顶点(队首)出队,对新的队首顶点重复上述操作. 注意:队列中同一时刻不能有两个相同的顶点,因此如果要入队的顶点已经在队列中就不再将其入队,这就需要一个标记数组

hihoCoder #1109 最小生成树之堆优化的Prim算法

原题地址:http://hihocoder.com/problemset/problem/1109 #1109 : 最小生成树三·堆优化的Prim算法 时间限制:10000ms 单点时限:1000ms 内存限制:256MB 描述 回到两个星期之前,在成功的使用Kruscal算法解决了问题之后,小Ho产生了一个疑问,究竟这样的算法在稀疏图上比Prim优化之处在哪里呢? 提示:没有无缘无故的优化! 输入 每个测试点(输入文件)有且仅有一组测试数据. 在一组测试数据中: 第1行为2个整数N.M,表示小

hihoCoder_#1109_堆优化的Prim算法

#1109 : 最小生成树三·堆优化的Prim算法 时间限制:10000ms 单点时限:1000ms 内存限制:256MB 描述 回到两个星期之前,在成功的使用Kruscal算法解决了问题之后,小Ho产生了一个疑问,究竟这样的算法在稀疏图上比Prim优化之处在哪里呢? 提示:没有无缘无故的优化! 输入 每个测试点(输入文件)有且仅有一组测试数据. 在一组测试数据中: 第1行为2个整数N.M,表示小Hi拥有的城市数量和小Hi筛选出路线的条数. 接下来的M行,每行描述一条路线,其中第i行为3个整数N

hiho一下 第二十九周 最小生成树三&#183;堆优化的Prim算法【14年寒假弄了好长时间没搞懂的prim优化:prim算法+堆优化 】

题目1 : 最小生成树三·堆优化的Prim算法 时间限制:10000ms 单点时限:1000ms 内存限制:256MB 描述 回到两个星期之前,在成功的使用Kruscal算法解决了问题之后,小Ho产生了一个疑问,究竟这样的算法在稀疏图上比Prim优化之处在哪里呢? 提示:没有无缘无故的优化! 输入 每个测试点(输入文件)有且仅有一组测试数据. 在一组测试数据中: 第1行为2个整数N.M,表示小Hi拥有的城市数量和小Hi筛选出路线的条数. 接下来的M行,每行描述一条路线,其中第i行为3个整数N1_

JVM优化 垃圾回收 算法 垃圾收集器 GC日志可视化查看

今日内容了解什么是垃圾回收掌握垃圾会回收的常见算法学习串行.并行.并发.G1垃圾收集器学习GC日志的可视化查看 1.什么是垃圾回收?程序的运行必然需要申请内存资源,无效的对象资源如果不及时处理就会一直占有内存 资源,最终将导致内存溢出,所以对内存资源的管理是非常重要了. 1.1.C/C++语言的垃圾回收在C/C++语言中,没有自动垃圾回收机制,是通过new关键字申请内存资源,通过delete 关键字释放内存资源.如果,程序员在某些位置没有写delete进行释放,那么申请的对象将一直占用内存资源,

HDU4725 The Shortest Path in Nya Graph(堆优化的dijkstra算法)

题意: 这是一个非常容易解决的问题,您的任务只是计算图像,而仅是计算干草成本和算法成本.如果您不懂此段话,请继续.Nya图是具有“层”的无向图.图中的每个节点都属于一个层,总共有N个节点.您可以以成本C从x层中的任何节点移动到x + 1层中的任何节点,因为道路是双向的,因此也可以以相同的成本从x + 1层移动到x层.此外,还有M个额外的边,每个边连接一对节点u和v,成本为w.帮助我们计算从节点1到节点N的最短路径. 题解: 主要是建图. N个点,然后有N层,要假如2*N个点. 总共是3*N个点.

USACO 3.2 butter 最短路

堆优化dijkstra 1 /* 2 PROB:butter 3 LANG:C++ 4 */ 5 6 #include <iostream> 7 #include <cstdio> 8 #include <queue> 9 #include <vector> 10 using namespace std; 11 const int Ni = 10000; 12 const int INF = 1<<27; 13 struct node{ 14 i

[位运算] [搜索] [递推优化] [计算几何] TEST 2016.7.15

NOIP2014 提高组模拟试题 第一试试题 题目概况: 中文题目名称 合理种植 排队 科技节 源程序文件名 plant.pas/.c/.cpp lineup.pas/.c/.cpp scifest.pas/.c/.cpp 输入文件名 plant.in lineup.in scifest.in 输出文件名 plant.out lineup.out scifest.out 每个测试点时限 1s 1s 1s 测试点数目 10 10 10 每个测试点分值 10 10 10 内存上限 128MB 128

最短路问题(dijkstral 算法)(优化待续)

迪杰斯特拉算法是由荷兰计算机科学家狄克斯特拉于1959 年提出的,因此又叫狄克斯特拉算法.是从一个顶点到其余各顶点的最短路径算法,解决的是有向图中最短路径问题.迪杰斯特拉算法主要特点是以起始点为中心向外层层扩展,直到扩展到终点为止. 该算法复杂度为n^2 这里有一篇讲解的很清晰的文章:http://blog.chinaunix.net/uid-26548237-id-3834514.html 下面说说我个人的理解: 就以这张图为例: 要找出A点到其他点的最短路径,应该怎么找? 这个算法的思路是: