hdu2066一个人的旅行(多源点多汇点的最短路径问题)

/*
   思路:多源点,多会点的最短路径!
   将最小号-1的节点但最源点,将最大号+1的点当作汇点!
   将问题转变成从一个源点到一个汇点的最短路径的问题!

   开始忘记初始化vector了,哇了好多次....坑爹啊
*/
#include<iostream>
#include<cstdio>
#include<algorithm>
#include<cstring>
#include<vector>
#define M 1100
#define INF 0x3f3f3f3f
using namespace std;

struct node{
   int v;
   int tt;
   node(){}

   node(int v, int tt){
      this->v=v;
      this->tt=tt;
   }
};

vector<node>v[M];
int d[M], vis[M];
int city[M];
int n;
int T, S, D;

void Dijkstra(){
   memset(d, 0x3f, sizeof(d));
   memset(vis, 0, sizeof(vis));
   d[0]=0;
   vis[0]=1;
   int root=0;
   for(int j=0; j<=n; ++j){
       int minLen=INF, p, len=v[root].size();
       for(int i=0; i<len; ++i){
          int u=v[root][i].v;
          if(!vis[u] && d[u] > d[root] + v[root][i].tt)
              d[u] = d[root] + v[root][i].tt;
       }//将所有的与root节点连接的节点的距离进行更新

       for(int i=0; i<=n+1; ++i)//然后从0节点到所有的节点的最短的距离!
          if(!vis[i] && minLen>d[i]){
             p=i;
             minLen=d[i];
          }
       if(minLen==INF)
          return;
       root=p;
       vis[root]=1;
   }
}

int main(){
      while(cin>>S>>T>>D){
          int a, b, t;
          n=-1;
          while(S--){
             cin>>a>>b>>t;
             v[a].push_back(node(b, t));
             v[b].push_back(node(a, t));
             n=max(n, max(a,b));
          }
          while(T--){
             cin>>a;
             v[0].push_back(node(a, 0));
             v[a].push_back(node(0, 0));
             n=max(n,a);
          }
          for(int i=1; i<=D; ++i){
             cin>>city[i];
             n=max(n, city[i]);
          }
          for(int i=1; i<=D; ++i){
             v[n+1].push_back(node(city[i],INF));
             v[city[i]].push_back(node(n+1,0));
          }
          Dijkstra();
          for(int i=0; i<=n+1; ++i)
             v[i].clear();
          cout<<d[n+1]<<endl;
      }
   return 0;
}
时间: 2025-01-29 23:44:55

hdu2066一个人的旅行(多源点多汇点的最短路径问题)的相关文章

算法研究:AOE网与关键路径简介

前面我们说过的拓扑排序主要是为解决一个工程能否顺序进行的问题,但有时我们还需要解决工程完成需要的最短时间 问题.如果我们要对一个流程图获得最短时间,就必须要分析它们的拓扑关系,并且找到当中最关键的流程,这个流程的时 间就是最短时间. 在前面讲了AOV网的基础上,来介绍一个新的概念.在一个表示工程的带权有向图中,用顶点表示 事件,用有向边表示活动,用边上的权值表示活动的持续时间,这种有向图的边表示活动的网,称之为AOE网(Activity On edge Network).由于一个工程,总有一个开

图论-重金悬赏:数据结构,关键路径求法,帮我看看写的对不对!!

问题描述 重金悬赏:数据结构,关键路径求法,帮我看看写的对不对!! 请帮我检查一下!!!指正错误,或者认为我写的对不对,手机拍的比较小,见谅!! 解决方案 解决方案二: 你图里这是要求最短路径而不是求关键路径,你先弄明白最短路径和关键路径的概念: 最短路径:如果从某顶点出发,这个顶点称为源点,经图的边到达另一顶点,这个顶点称为终点,所经过的路径不止一条,找出一条路径使的沿此路径上各边的权值之和为最小.(从源点到终点走得最短的路线权值之和) 关键路径:采用边表示活动(Activity On Edg

poj 1274 The Perfact Stall

click here ~~ ***The Perfect Stall*** Description Farmer John completed his new barn just last week, complete with all the latest milking technology. Unfortunately, due to engineering problems, all the stalls in the new barn are different. For the fi

poj1273Drainage Ditches

#include<iostream> /* 题意:就是寻找从源点到汇点的最大流! 要注意的是每两个点的流量可能有多个,也就是说有重边,所以要把两个点的所有的流量都加起来 就是这两个点之间的流量了! 思路:建图之后直接套用最大流算法(EK, 或者是Dinic算法) 图解Dinic算法流程! */ #include<queue> #include<cstring> #include<cstdio> #include<algorithm> #defin

poj 1459 Power Network

click here ~~ ***Power Network*** Description A power network consists of nodes (power stations, consumers and dispatchers) connected by power transport lines. A node u may be supplied with an amount s(u) >= 0 of power, may produce an amount 0 <= p(

最大流:Dinic模板

/* Date : 2015-8-21 晚上 Author : ITAK Motto : 今日的我要超越昨日的我,明日的我要胜过今日的我: 以创作出更好的代码为目标,不断地超越自己. */ #include <iostream> #include <cstdio> using namespace std; ///oo表示无穷大 const int oo = 1e9+5; ///mm表示边的最大数量,因为要双向建边 const int mm = 111111; ///点的最大数量 c

【算法导论】单源最短路径之Dijkstra算法

        Dijkstra算法解决了有向图上带正权值的单源最短路径问题,其运行时间要比Bellman-Ford算法低,但适用范围比Bellman-Ford算法窄. 迪杰斯特拉提出的按路径长度递增次序来产生源点到各顶点的最短路径的算法思想是:对有n个顶点的有向连通网络G=(V, E),首先从V中取出源点u0放入最短路径顶点集合U中,这时的最短路径网络S=({u0}, {}); 然后从uU和vV-U中找一条代价最小的边(u*, v*)加入到S中去,此时S=({u0, v*}, {(u0,

【算法导论】最大二分匹配

        最大二分匹配问题在现实生活中比较普遍,常常出现在任务分配上.例如,有5个员工,4个不同的任务,而不同员工能够完成不同或相同的任务.也就是说,有的员工只会做这个任务,有的员工会做那个任务,有的员工会做一些任务.图解如下:左边代表员工,右边代表任务,连线代表有能力完成.   我们的问题是合理安排员工,尽可能地完成最多的任务数.上图中阴影部分为一种最好的分配方式.前一篇文章中,我们介绍了最大流问题,在这里我们可以将最大二分匹配问题转变成最大流问题.具体如下图所示:   其中每条边的最大

费用流模板

我借鉴了一些大神的代码也就是他们经常用的模板... 费用流模板 #include<cstdio> #include<iostream> using namespace std; const int oo=1e9; const int mm=11111; const int mn=888; int node,src,dest,edge; int ver[mm],flow[mm],cost[mm],next[mm]; int head[mn],dis[mn],p[mn],q[mn],v