第七届山东省省赛C Proxy(最短路)

题意:

给出n个点和一些单向边,问从0到n+1

如果不能到则输出-1

如果能一步到则输出0

否则输出第一个到达的节点

如果两条路距离相等,则输出较小的节点

思路:

赛场上从前向后扫然后又向前推的,,,特别别扭

回来之后想了下,可以建反向边,从n+1走到0记录前驱就好了

/* ***********************************************
Author        :devil
Created Time  :2016/6/10 14:20:54
************************************************ */
#include <cstdio>
#include <cstring>
#include <iostream>
#include <algorithm>
#include <vector>
#include <queue>
#include <set>
#include <map>
#include <string>
#include <cmath>
#include <stdlib.h>
using namespace std;
const int N=1010;
const int inf=0x3f3f3f3f;
struct node
{
    int v,d;
    node(int a=0,int b=0):v(a),d(b){}
    bool operator < (const node &a) const
    {
        return d>a.d;
    }
};
struct edge
{
    int v,cost;
    edge(int a=0,int b=0):v(a),cost(b){}
};
vector<edge> eg[N];
bool vis[N];
int n,m,dis[N],pre[N];
void dijkstra(int x)
{
    memset(vis,false,sizeof(vis));
    for(int i=0; i<=n+1; i++)
        dis[i]=inf;
    priority_queue<node>q;
    while(!q.empty()) q.pop();
    dis[x]=0;
    q.push(node(x,0));
    node tmp;
    while(!q.empty())
    {
        tmp=q.top();
        q.pop();
        int u=tmp.v;
        if(vis[u]) continue;
        vis[u]=1;
        for(int i=0; i<eg[u].size(); i++)
        {
            int v=eg[tmp.v][i].v;
            int cost=eg[u][i].cost;
            if(!vis[v]&&dis[v]>dis[u]+cost)
            {
                dis[v]=dis[u]+cost;
                pre[v]=u;
                q.push(node(v,dis[v]));
            }
            else if(!vis[v]&&dis[v]==dis[u]+cost)
                pre[v]=min(pre[v],u);
        }
    }
}
int main()
{
    //freopen("in.txt","r",stdin);
    int t,u,v,w;
    scanf("%d",&t);
    while(t--)
    {
        scanf("%d%d",&n,&m);
        for(int i=0;i<=n+1;i++)
            eg[i].clear();
        while(m--)
        {
            scanf("%d%d%d",&u,&v,&w);
            eg[v].push_back(edge(u,w));
        }
        dijkstra(n+1);
        if(dis[0]==inf)
        {
            printf("-1\n");
            continue;
        }
        if(pre[0]==n+1)
        {
            printf("0\n");
            continue;
        }
        printf("%d\n",pre[0]);
    }
    return 0;
}
时间: 2024-10-09 11:01:54

第七届山东省省赛C Proxy(最短路)的相关文章

第七届山东省省赛D Swiss-system tournament(归并排序)

题意: 给出2n个选手的id,能力值和初始分数 然后按分数从大到小,id从小到大排序 相邻的选手打 能力值大的分数+1 进行r轮 问你比赛过后,排名第q的选手id是多少 思路: 开始先sort一遍,每一轮比赛都归并处理 赢得人分一组,输的人分一组,保证两组有序 然后合并到原数组 持续r轮后输出结果就好了 /* *********************************************** Author :devil Created Time :2016/6/10 14:24:16

2016 年宁波工程学院第七届ACM校赛题解报告

2016 年宁波工程学院第七届ACM校赛题解报告 本题解代码直接为比赛代码,仅供参考. A,B,C,D,G,H,J,K,L,M 来自 Ticsmtc 同学. F 来自 Gealo 同学. E,I 来自Alex 学长. Promblem A :    Two Sum 时间限制: 1 Sec  内存限制: 64 MB 题目描述: 给出n个数,另外给出?个整数S,判断是否可以从中取出2个数,使得这两个数的和是S. 输入: 第?行有个整数T(1 <= T <= 10),代表数据组数. 对于每组数据,第

第七届山东省ACM省赛

激动人心的省赛终于结束了…平静下来再回头看真的感觉一波三折…先是赛前毫无预兆的查出突发性耳聋…伴随而来的就是左耳听力下降.轻微耳鸣.极个别情况下的头晕…不过这都还好,毕竟药物可以恢复…热身赛只过了一道输出济南有多少泉水的水题,竟然第二次就猜对了,有个队交了四五十次…山师很心机的把酒店安排在了商业区.闹市和女子学院附近…(开个玩笑)为了不败第二天人品,我老老实实地待在了酒店,并没有出去嗨…正式赛开了…比赛打得多了,真的不紧张了…或许是喝了磊神指定饮料-红牛的作用…A是个签到题,我和Julyc讨论一

山东省第七届ACM竞赛 C题 Proxy (Dijkstra算法,单源路径最短问题)

题意:给定0-n+1个点,和m条边,让你找到一条从0到n+1的最短路,输出与0相连的结点... 析:很明显么,是Dijkstra算法,不过特殊的是要输出与0相连的边,所以我们倒着搜,也是从n+1找到0, 那么不就能找到与0相连的边么,注意判断相等值的时候.当时写错了好多次,就是没有考虑好边界. 代码如下: #include <iostream> #include <cstdio> #include <cmath> #include <algorithm> #

【第七届山东省ACM竞赛】Square Number

思路比较明确,就是一个数,如果和另外一个数乘起来是个平方数的话,那么满足一个条件 数A可以分解成为n1 个 a1,n2 个 a2 -- 数B可以分解成为m1个 a1,m2 个 a2-- 这满足的条件是(ni + mi) % 2 == 0 一个数的分解出来奇个数的因子乘起来得到的值为v,找之前有几个数他的奇个数因子成积为v 代码如下: #include<cmath> #include<cstdio> #include<cstring> #include<iostre

科来杯”第七届山东省大学生 网络安全技能大赛

[Reserve] [re-elf] [babyLogin] v10和v11差一个字节,在内存中.所以 v11[0-1] 就是v10的地址 最后结果是求v1,所以逆向算法就是(byte_40925C[i*2] ^ byte_409034[dword_40924C[i % 4]] ^ 0x68) - 2 [Moblie] 加密:对字符串的每位的ascii+1 解密:对字符串的每位的ascii-1 [web] [有趣的PHP与JS ] 打不开了没法截图了 XFF第一层绕过 修改UA第二层绕过 md5

第七届山东省大学生网络安全技能大赛 file

打开IDA直接F5如下 经过分析箭头处才是最关键的 encode函数虽然是引用,但是函数内并没有对其进行修改,而是将其副本base64加密 查询到 flllag 和 sttr_home 的值 计算v13的值 计算过程直接复制粘贴,修改到能编译就行了 然后异或出来goal 也就是我们的输入 #include<bits/stdc++.h> using namespace std; string str="664e06226625425d562e766e042d422c072c45692d

2016 第七届蓝桥杯 c/c++ B组省赛真题及解题报告

2016 第七届蓝桥杯 c/c++ B组省赛真题及解题报告 勘误1:第6题第4个 if最后一个条件粗心写错了,答案应为1580. 条件应为abs(a[3]-a[7])!=1,宝宝心理苦啊.!感谢zzh童鞋的提醒. 勘误2:第7题在推断连通的时候条件写错了,后两个if条件中是应该是<=12 落了一个等于号.正确答案应为116. 1.煤球数目 有一堆煤球.堆成三角棱锥形.详细: 第一层放1个, 第二层3个(排列成三角形), 第三层6个(排列成三角形), 第四层10个(排列成三角形). -. 假设一共

??第七届河南省赛B.海岛争霸(并差集)

B.海岛争霸 Time Limit: 2 Sec  Memory Limit: 128 MB Submit: 130  Solved: 48 [Submit][Status][Web Board] Description 神秘的海洋,惊险的探险之路,打捞海底宝藏,激烈的海战,海盗劫富等等.加勒比海盗,你知道吧?杰克船长驾驶着自己的的战船黑珍珠1号要征服各个海岛的海盜,最后成为海盗王. 这是一个由海洋.岛屿和海盗组成的危险世界.杰克船长准备从自己所占领的岛屿A开始征程,逐个去占领每一个岛屿.面对危