hdu1535(Dijkstra)

题目的意思是有N个车站,N个人,将N个人从一个车站分配到N个车站去,再让他们回到这个车站。交通系统全部是单项的。求总花费最小。

一开始想到FLoyd,但看了数据范围,发现做不了,后来想到做两遍Dijkstra

思路是,求一遍某个点出发的单源最短路,再将图反向,再求一边这个点的单源最短路。两遍的结果保存到两个数组,最后将两个数组中的所有值全部相加然后输出。

原理是第一遍求得从一个点出发到其他所有点的最短路径也就是最小花费,将图反转之后再求一遍,求出的是从所有其他点到这个点的最短路,(最新小花费)。

下面代码在服务器上能过,但在自己电脑上测试时需要将long long 改为int,或者缩小MaxN的值,因为本机申请不到这么大的数组。

#include <iostream>
#include <memory.h>
#include <vector>
#include <queue>
#include <stdio.h>
#define MaxN 1000005
#define INF 1000000
struct node
{
    int e,w;
    node(int ee,int ww):e(ee),w(ww) {}
    node(){}
    bool friend operator<(node n1,node n2)
    {
        return n1.w>n2.w;
    }
};

using namespace std;
int N,M;
void Dijistra(vector<vector<node> > v,long long dist[MaxN])
{
    for(int i=1;i<=N;i++)
        dist[i]=INF;
    dist[1]=0;
    priority_queue<node> Q;
    Q.push(node(1,0));
    while(!Q.empty())
    {
        node now=Q.top();
        Q.pop();
        int S=now.e;
        for(int i=0;i<v[S].size();i++)
        {
            int E=v[S][i].e;
            if(dist[S]+v[S][i].w<dist[E])
            {
                dist[E]=dist[S]+v[S][i].w;
                Q.push(node(E,dist[E]));
            }
        }
    }
}
void output(long long dist1[MaxN],long long dist2[MaxN])
{
    long long ans=0;
    for(int i=1;i<=N;i++)
        ans+=(dist1[i]+dist2[i]);
    cout<<ans<<endl;
}
int main()
{
    vector<vector<node> > v1;
    vector<vector<node> > v2;
    long long dist1[MaxN],dist2[MaxN];
    int a,b,c;
    int T;
    scanf("%d",&T);
    while(T--)
    {
        scanf("%d%d",&N,&M);
        v1.clear();v1.resize(N+1);
        v2.clear();v2.resize(N+1);
        while(M--)
        {
            scanf("%d%d%d",&a,&b,&c);
            v1[a].push_back(node(b,c));
            v2[b].push_back(node(a,c));
        }
        Dijistra(v1,dist1);
        Dijistra(v2,dist2);
        output(dist1,dist2);
    }
    return 0;
}

  

时间: 2024-10-09 21:01:30

hdu1535(Dijkstra)的相关文章

畅通project续HDU杭电1874【dijkstra算法 || SPFA】

http://acm.hdu.edu.cn/showproblem.php?pid=1874 Problem Description 某省自从实行了非常多年的畅通project计划后.最终修建了非常多路.只是路多了也不好,每次要从一个城镇到还有一个城镇时,都有很多种道路方案能够选择,而某些方案要比还有一些方案行走的距离要短非常多.这让行人非常困扰. 如今,已知起点和终点,请你计算出要从起点到终点.最短须要行走多少距离. Input 本题目包括多组数据.请处理到文件结束. 每组数据第一行包括两个正

Choose the best route 【Dijkstra】

Problem DescriptionOne day , Kiki wants to visit one of her friends. As she is liable to carsickness , she wants to arrive at her friend's home as soon as possible . Now give you a map of the city's traffic route, and the stations which are near Kiki

Bus System 【dijkstra算法】

Because of the huge population of China, public transportation is very important. Bus is an important transportation method in traditional public transportation system. And it's still playing an important role even now.The bus system of City X is qui

Dijkstra

//在这里采用两种方式实现Dijkstra算法,经过测试两种方式:第一种:通过Dist[]让每一个顶点中Dist[]中寻找最短路径的点:第二种方式:从已经收录的顶点的相邻顶点中选择出最短路//径的的顶点,此种方式适合用于稠密图,减少点的遍历. #include<iostream> #include<malloc.h> using namespace std; #define INF (100000) //相连顶点的信息 typedef struct AdjNode{ int Wei

ACM: HDU 2544 最短路-Dijkstra算法

HDU 2544最短路 Time Limit:1000MS     Memory Limit:32768KB     64bit IO Format:%I64d & %I64u Description 在每年的校赛里,所有进入决赛的同学都会获得一件很漂亮的t-shirt.但是每当我们的工作人员把上百件的衣服从商店运回到赛场的时候,却是非常累的!所以现在他们想要寻找最短的从商店到赛场的路线,你可以帮助他们吗? Input 输入包括多组数据.每组数据第一行是两个整数N.M(N<=100,M<

ACM: HDU 3790 最短路径问题-Dijkstra算法

HDU 3790 最短路径问题 Time Limit:1000MS     Memory Limit:32768KB     64bit IO Format:%I64d & %I64u Description 给你n个点,m条无向边,每条边都有长度d和花费p,给你起点s终点t,要求输出起点到终点的最短距离及其花费,如果最短距离有多条路线,则输出花费最少的. Input 输入n,m,点的编号是1~n,然后是m行,每行4个数 a,b,d,p,表示a和b之间有一条边,且其长度为d,花费为p.最后一行是

dijkstra堆优化模板

1 #include<iostream> 2 #include<cmath> 3 #include<algorithm> 4 #include<cstring> 5 #include<cstdio> 6 #include<queue> 7 #define inf 2147483647 8 using namespace std; 9 struct data 10 { 11 int from,to,next,w; 12 data(){f

邻接表实现Dijkstra算法以及DFS与BFS算法

//============================================================================ // Name : ListDijkstra.cpp // Author : fffff // Version : // Copyright : Your copyright notice // Description : Hello World in C++, Ansi-style //==========================

Dijkstra算法(求解单源最短路)详解 + 变形 之 poj 1860 Currency Exchange

/* 求解单源最短路问题:Dijkstra算法(该图所有边的权值非负) 关键(贪心): (1)找到最短距离已经确定的节点,从它出发更新与其相邻节点的最短距离: (2)此后不再关心(1)中“最短距离已经确定的节点”. 时间复杂度(大概的分析,不准确): “找到最短距离已经确定的节点” => O(|V|) "从它出发更新与其相邻节点的最短距离" => 邻接矩阵:O(|V|),邻接表:O(|E|) 需要循环以上两个步骤V次,所以时间复杂度:O(V^2) 即:在|E|较小的情况下,