hdu6005 Pandaland 想法+dijkstra

/**
题目:hdu6005 Pandaland
链接:http://acm.hdu.edu.cn/showproblem.php?pid=6005
题意:给定一个带权无向图,求权值和最小的环的值,如果不存在环输出0;

思路:枚举每条边,然后dijkstra求s到t的距离,dijkstra过程中舍去s-t的这条边。
两个优化:dijkstra找到了t就跳出。或者出队列的距离>=当前找到的最小距离跳出。

*/

#include<iostream>
#include<cstdio>
#include<algorithm>
#include<map>
#include<vector>
#include<queue>
#include<cstring>
using namespace std;
typedef pair<int,int> P;
typedef long long LL;
const int N = 4e3+10;
const int INF = 0x3f3f3f3f;
struct edge{int to, cost;};
int V, mis;
vector<edge> G[2*N];
int d[N*2+1];
void dijkstra(int s,int t)
{
    priority_queue<P,vector<P>, greater<P> > que;
    fill(d,d+V,INF);
    d[s] = 0;
    que.push(P(0,s));
    while(!que.empty()){
        P p = que.top(); que.pop();
        int v = p.second;
        if(d[v]<p.first) continue;
        if(v==t) break;
        if(d[v]>=mis) break;
        for(int i = 0; i < (int)G[v].size(); i++){
            edge e = G[v][i];
            if(v==s&&e.to==t) continue;
            if(d[e.to]>d[v]+e.cost){
                d[e.to] = d[v]+e.cost;
                que.push(P(d[e.to],e.to));
            }
        }
    }
}
map<P,int> mp;
struct node
{
    int u,v;
    int cost;
}Eg[N];
int main()
{
    int cas = 1, T, m;
    cin>>T;
    while(T--)
    {
        int cnt = 1;
        scanf("%d",&m);
        int cost, x1, y1, x2, y2;
        for(int i = 1; i <= 2*N; i++) G[i].clear();
        mp.clear();
        for(int i = 1; i <= m; i++){
            scanf("%d%d%d%d%d",&x1,&y1,&x2,&y2,&cost);
            int u, v;
            if(mp[P(x1,y1)]==0){
                mp[P(x1,y1)] = cnt++;
            }
            if(mp[P(x2,y2)]==0){
                mp[P(x2,y2)] = cnt++;
            }
            u = mp[P(x1,y1)], v = mp[P(x2,y2)];
            G[u].push_back(edge{v,cost});
            G[v].push_back(edge{u,cost});
            Eg[i].cost = cost;
            Eg[i].u = u;
            Eg[i].v = v;
        }
        mis = INF;
        V = cnt;
        for(int i = 1; i <= m; i++){
            dijkstra(Eg[i].u,Eg[i].v);
            mis = min(mis,d[Eg[i].v]+Eg[i].cost);
        }
        if(mis==INF){
            printf("Case #%d: 0\n",cas++);
        }else
        printf("Case #%d: %d\n",cas++,mis);
    }
    return 0;
}
时间: 2024-12-10 04:07:13

hdu6005 Pandaland 想法+dijkstra的相关文章

带权最短路 Dijkstra, SPFA, Bellman-Ford, ASP, Floyd-Warshall 算法分析

转载:https://www.renfei.org/blog/weighted-shortest-path.html 图论中,用来求最短路的方法有很多,适用范围和时间复杂度也各不相同. 本文主要介绍的算法的代码主要来源如下: Dijkstra: Algorithms(<算法概论>)Sanjoy Dasgupta, Christos Papadimitriou, Umesh Vazirani;<算法竞赛入门经典-训练指南>刘汝佳.陈峰. SPFA (Shortest Path Fas

最短路径算法-Dijkstra算法的应用之单词转换(词梯问题)

一,问题描述 在英文单词表中,有一些单词非常相似,它们可以通过只变换一个字符而得到另一个单词.比如:hive-->five:wine-->line:line-->nine:nine-->mine..... 那么,就存在这样一个问题:给定一个单词作为起始单词(相当于图的源点),给定另一个单词作为终点,求从起点单词经过的最少变换(每次变换只会变换一个字符),变成终点单词. 这个问题,其实就是最短路径问题. 由于最短路径问题中,求解源点到终点的最短路径与求解源点到图中所有顶点的最短路径复

(简单) POJ 1062 昂贵的聘礼,Dijkstra。

Description 年轻的探险家来到了一个印第安部落里.在那里他和酋长的女儿相爱了,于是便向酋长去求亲.酋长要他用10000个金币作为聘礼才答应把女儿嫁给他.探险家 拿不出这么多金币,便请求酋长降低要求.酋长说:"嗯,如果你能够替我弄到大祭司的皮袄,我可以只要8000金币.如果你能够弄来他的水晶球,那么只要 5000金币就行了."探险家就跑到大祭司那里,向他要求皮袄或水晶球,大祭司要他用金币来换,或者替他弄来其他的东西,他可以降低价格.探险家于是又跑 到其他地方,其他人也提出了类似

对当前网络路由的一点想法

五一小长假,和朋友开车去了浙江,发现了"基于目的地的最短距离算法"的弊端,也许就是这个算法导致了高速公路在某个时间段的定期规律性拥堵!从嘉定出发,G1501一路畅通,但是一旦转到G60沪昆高速,瞬间拥堵起来,实际上,早在G1501上时,就有公告牌,说沪昆高速有施工,可是大家还是全部转到了沪昆高速,留下S19/G15成了被抛弃的摆设...知道原因是什么吗?很简单,因为沪昆高速那条路最近!人们太相信导航,很少有人没事研究地图,所以很多人都上了当,当然这并不包括我.很多导航都是根据Dijks

Dijkstra算法——《算法导论》学习心得(十三)

这两天在做一个项目,关于北京市出租车的,然后用到了Dijkstra算法,所以这篇文章就先写Dijkstra算法了.在大二下的时候学了数据结构,书里面也讲了Dijkstra算法,但是当时怎么也没理解,结果考试的时候就考了,哎蛋疼!现在用到了,又得硬着头皮去学,结果很快弄明白了,只是在写代码时出了一些很低级的错误,调Bug用了不少时间.最后总结只能说:不是你不会,而是没到你非会不可的地步!在这篇文章里我就用实际的项目给大家讲Dijkstra算法. 背景: 迪杰斯特拉算法是由荷兰计算机科学家狄克斯特拉

数据结构与算法——最短路径Dijkstra算法的C++实现

之前的讨论了无权图的最短路径算法.数据结构与算法--无权最短路径算法的C++实现 如果是加权图,那么问题就变得困难了,不过仍然可以采用无权情况的想法. 我们仍然保留之前的信息.因此,每个顶点会被标记为known或unknown,每个顶点保留一个尝试性的距离dv(这个距离是只使用一些known顶点作为中间顶点从s到v的最短路径的长),每个顶点还保留字段pv,该字段是记录引起dv变化的最后的顶点. 图顶点信息的数据结构: //保存每个顶点信息的数据结构 struct GraphNode{ bool

最短路算法 :Bellman-ford算法 &amp; Dijkstra算法 &amp; floyd算法 &amp; SPFA算法 详解

 本人QQ :2319411771   邮箱 : [email protected] 若您发现本文有什么错误,请联系我,我会及时改正的,谢谢您的合作! 本文为原创文章,转载请注明出处 本文链接   :http://www.cnblogs.com/Yan-C/p/3916281.html . 很早就想写一下最短路的总结了,但是一直懒,就没有写,这几天又在看最短路,岁没什么长进,但还是加深了点理解. 于是就想写一个大点的总结,要写一个全的. 在本文中因为邻接表在比赛中不如前向星好写,而且前向星效率并

cogs 2. 旅行计划 dijkstra+打印路径小技巧

2. 旅行计划 ★★   输入文件:djs.in   输出文件:djs.out   简单对比时间限制:3 s   内存限制:128 MB [题目描述] 过暑假了,阿杜准备出行旅游,他已经查到了某些城市的两两之间的距离及可行路线(可行路线有方向),如下图所示.请你编程计算从阿杜所住城市到其它城市的最短路径以帮助阿杜制定旅行计划. [输入格式] 输入由若干行组成,第一行有三个整数 n(1≤n≤100) 为城市数,m(1≤m≤n2) 为城市间道路数,s(0≤s≤n−1) 是阿杜所住城市.第 2 至 m

dijkstra算法及其优化

dijkstra算法是经典的贪心算法.基本的想法是,有两个集合S和E,开始S集合中只有一个起点,E集合中有剩下的其他点.遍历E集合中的所有点,找出与起点距离最近的一个点,将其加入集合S,并用该点去更新起点到其他点的最短路径. 由动图结合上面的思路,我们可以看出,算法的基本框架是: 1 1.初始化 2 for i(0 -> n - 1) 3 { 4 2.找出距离起点最近的点 5 3.标记该点加入集合S 6 4.用新加入集合S的点去更新起点到其他点的最短距离 7 } 1.其中初始化包括了距离数组di