cogs 1254. 最难的任务 Dijkstra + 重边处理

1254. 最难的任务

★   输入文件:hardest.in   输出文件:hardest.out   简单对比
时间限制:1 s   内存限制:128 MB

【题目描述】

这个真的很难。算出 12345678987654321!,这个“!”是阶乘的意思。

呵,我在开玩笑。没有人成功的解决。

事实上,你是一个间谍。你要窃取一些敌军机密,现在你需要找到一个方法使你逃走的时间最少。

这里有很多交叉点和很多道路,在两个交叉点间可能有多条路。你很困惑,但随身携带笔记本电脑让你很快乐。

【输入格式】

第一行有一个整数T(T≤10)表示测试数据个数。

每组数据以两个整数开始,n和m(1≤n≤200,0≤m≤10000),交叉点的个数和各自的道路数。下面m行有三个整数 i,j,k(i<>j, 1≤k≤10000), 意思是i和j中间有一条长度为k的路。

你可以假设交叉点的编号为1...n。你需要从交叉点1到交叉点n。

道路是双向的。

【输出格式】

对于每组测试数据,打印最短距离。如果没有路可以出去,打印-1。

【样例输入】

1
2 1
1 2 3

【样例输出】

3

QAQ这题也太坑了吧 交了3遍才过 一共出了两个问题1.如果无法到达 输出-1这里有一点需要注意的是尽管memset里写的0x3f  但是实际的赋值是0x3f3f3f3f2.有重边肿么办?额 我用了一个神奇的方法就是一开始把边权数组Cost全部赋值为正无穷(反正就是一个很大的数)每次输入边权 就把边权和Cost数组里的值取一个min  (这一道题数据范围小 Cost我就开了个二维数组,太蒟了)嗯嗯 然后我没有处理就是如果已经加入过该边就不再加了首先这可能会很慢 每次都要从前往后猛扫一遍其次 Dijkstra里不是有一个vis数组吗 走过一遍就不会再走了 只需要处理一下边权使得边权保持最小就行了 Σ(⊙▽⊙"a?(^∇^*)AC代码:
#include<bits/stdc++.h>
#define pa pair<int,int>
#define maxn 205
#define INF 0x3f3f3f3f
using namespace std;
int T,n,m;
bool Bian[maxn][maxn];
int Cost[maxn][maxn];
vector<int> v[maxn];
priority_queue<pa,vector<pa>,greater<pa> > q;
int dis[maxn],vis[maxn];
void Dijkstra()
{
    memset(dis,0x3f,sizeof(dis));
    memset(vis,0,sizeof(vis));
    dis[1]=0;
    q.push(make_pair(0,1));
    while(!q.empty())
    {
        int x=q.top().second;
        q.pop();
        if(vis[x])
            continue;
        vis[x]=1;
        for(int i=0;i<v[x].size();i++)
        {
            int y=v[x][i];
            if(dis[x]+Cost[x][y]<dis[y])
            {
                dis[y]=dis[x]+Cost[x][y];
                q.push(make_pair(dis[y],y));
            }
        }
    }
}
int main()
{
    freopen("hardest.in","r",stdin);
    freopen("hardest.out","w",stdout);
    scanf("%d",&T);
    while(T--)
    {
        memset(Cost,0x3f,sizeof(Cost));
        scanf("%d%d",&n,&m);
        for(int i=1;i<=m;i++)
        {
            int x,y,z;
            scanf("%d%d%d",&x,&y,&z);
            Cost[x][y]=Cost[y][x]=min(Cost[x][y],z);
            v[x].push_back(y);//QAQ有重边到底咋办啊
            v[y].push_back(x);
        }
        Dijkstra();
        if(dis[n]==INF)
            printf("-1\n");
        else
            printf("%d\n",dis[n]);
    }

    return 0;
}

 

原文地址:https://www.cnblogs.com/Tidoblogs/p/11331255.html

时间: 2024-10-30 04:04:40

cogs 1254. 最难的任务 Dijkstra + 重边处理的相关文章

HDU 2066 一个人的旅行(dijkstra水题+判重边)

题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=2066 题目大意:输入数据有多组,每组的第一行是三个整数T,S和D,表示有T条路,和草儿家相邻的城市的有S个,草儿想去的地方有D个:接着有T行,每行有三个整数a,b,time,表示a,b城市之间的车程是time小时:(1=<(a,b)<=1000;a,b 之间可能有多条路)接着的第T+1行有S个数,表示和草儿家相连的城市:接着的第T+2行有D个数,表示草儿想去地方. 输出草儿能去某个喜欢的城市的最短

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

cogs 364. [HDU 1548] 奇怪的电梯 Dijkstra

364. [HDU 1548] 奇怪的电梯 ★   输入文件:lift.in   输出文件:lift.out   简单对比时间限制:1 s   内存限制:128 MB [问题描述] 呵呵,有一天我做了一个梦,梦见了一种很奇怪的电梯.大楼的每一层楼都可以停电梯,而且第 i 层楼 (1<=i<=N) 上有一个数字 Ki(0<=Ki<=N) .电梯只有四个按钮:开,关,上,下.上下的层数等于当前楼层上的那个数字.当然,如果不能满足要求,相应的按钮就会失灵.例如: 3 3 1 2 5 代表

POJ 2387 Til the Cows Come Home (最短路+Dijkstra)

Til the Cows Come Home Time Limit: 1000MS   Memory Limit: 65536K Total Submissions: 29550   Accepted: 9935 Description Bessie is out in the field and wants to get back to the barn to get as much sleep as possible before Farmer John wakes her for the

【bzoj3073】[Pa2011]Journeys 线段树优化建图+堆优化Dijkstra

题目描述 Seter建造了一个很大的星球,他准备建造N个国家和无数双向道路.N个国家很快建造好了,用1..N编号,但是他发现道路实在太多了,他要一条条建简直是不可能的!于是他以如下方式建造道路:(a,b),(c,d)表示,对于任意两个国家x,y,如果a<=x<=b,c<=y<=d,那么在xy之间建造一条道路.Seter保证不会有一个国家与自己之间有道路. Seter好不容易建好了所有道路,他现在在位于P号的首都.Seter想知道P号国家到任意一个国家最少需要经过几条道路.当然,Se

NOJ 2015年陕西省程序设计竞赛网络预赛(正式赛)(忙碌的选课系统-拓扑排序注意重边)

D - 忙碌的选课系统 Time Limit: 10000 ms        Memory Limit: 65536 KB Submit Description 每学期末,都是万众瞩目的选课时间,由于人数过多,某学校的服务器常常被无数的学生挤的爆掉,这是,教务系统大人说,你们选个课都这么慢,居然还怪我们.于是,每次教务系统都会在服务器快要瘫痪前关闭它.在无数学生的强烈抗议下,教务系统妥协了,再给每个人一次机会,但他让我们用最快的方式决定该选的课程,选上后就退出. 这让大一学渣狗犯了难,在新的选

HDU - 3790 最短路径问题(Dijkstra+优先队列优化)

题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=3790 题意:中文题(边被赋予两种属性,一种是路径,一种是花费),然后略.(逃...... 今天看了卿学姐的视频,初尝SPFA和Dijkstra. 一个是用队列优化,一个是用优先队列优化.这道题目用这两种方法都可以. dijkstra算法思想(贪心):从距离起点最近的点开始,从这个点遍历一遍它周围的点,进行松弛操作,直到最终点. 整个的算法思想就是贪心,每次都给它形成最短路. 这道题目值得注意的是预处

UVA-11367 Full Tank? (dijkstra)

题目大意:有n个加油站,每个加油站的油价已知,并且已知油箱的大小,问能否从起点走到终点,若能,找出最小油费. 题目分析:记得在做暴力搜索的时候做过这道题,不算难.但是这次是用dijkstra算法做的,时间复杂度不理想,差一点超时(1.9s,限制是2s).用BFS做的话要快很多. 代码如下: # include<iostream> # include<cstdio> # include<queue> # include<cstring> # include&l

COGS 497——奶牛派对

http://218.28.19.228/cogs/problem/problem.php?pid=497 我们发现每头牛需要走的路程即为它到x的最短路+x到它的最短路. 转化: 于是这道题变成了一道典型的单源最短路问题,只需求出每个点到x的最短路dl,以及从x到此点的最短路d2,然后去找max(dl+d2)即可. 效率分析: 使用dijsktra算法,时间复杂度为O(n^2). [我的程序] 1 type aa=array[1..1000,1..1000] of longint; 2 var