[10.4模拟赛]T2

T2

Description

现有一个\(n\)个点,\(m\)条无向边的图。要求求出从编号为\(1\)的点到编号为\(n\)的点经过的边的边权的绝对值之和最小的路径。特别的,每经过一条边,图上所有边的边权就会改变,若原边权为x,新的边权是\(\frac{1}{1-x}\)。
答案保留3位小数

Input

第一行两个整数\(m\),\(n\),表示点数和边数。

接下来\(m\)行,每行三个整数\(u\),\(v\),\(x\),表示有一条连接\(u\),\(v\),边权位\(x\)。

Output

若\(1\)和\(n\)联通,输出最小的边权的绝对值之和
否则输出"chu ti ren shi zhi zhang"(没有引号)。

Sample Input

Sample Output

Data Constraint

对于\(30\)%的数据,\(n<=500\),

Solution

Code

#include<iostream>
#include<cstdio>
#include<cmath>
#include<queue>
using namespace std;
#define eps 0.00001
#define MAXN 5000100
struct rec {
    int nxt, ver;
    double dis;
} t[MAXN];
struct Rec {
    int k;
    double w;
};
bool operator < (const Rec &x, const Rec &y) {
    return x.w > y.w;
}
int n, m, u, v, x, cnt;
int head[MAXN];
bool flag[MAXN];
Rec s;
priority_queue <Rec> h;
inline int read() {
    int s = 0, w = 1;
    char c = getchar();
    for (; !isdigit(c); c = getchar()) if (c == '-') w = -1;
    for (; isdigit(c); c = getchar()) s = (s << 1) + (s << 3) + (c ^ 48);
    return s * w;
}
inline void add(int u, int v, double w) {
    t[++cnt].nxt = head[u], t[cnt].ver = v, t[cnt].dis = w, head[u] = cnt;
}
int main() {
    freopen("pb.in", "r", stdin);
    freopen("pb.out", "w", stdout);
    n = read(), m = read();
    for (register int i = 1; i <= m; i++) {
        u = read(), v = read(), x = read();
        double w = x;
        add(u, v + n, fabs(w)), add(v, u + n, fabs(w));
        add(u + n, v + 2 * n, fabs(1 / (1 - w))), add(v + n, u + 2 * n, fabs(1 / (1 - w)));
        add(u + 2 * n, v, fabs(1 - 1 / w)), add(v + 2 * n, u, fabs(1 - 1 / w));
    }
    h.push((Rec){1, 0});
    while (!h.empty()) {
        s = h.top();
        h.pop();
        if (flag[s.k]) continue;
        flag[s.k] = true;
        if (s.k == n || s.k == 2 * n || s.k == 3 * n) break;
        for (register int i = head[s.k]; i; i = t[i].nxt) {
            int v = t[i].ver;
            if (!flag[v])
                h.push((Rec){v, s.w + t[i].dis});
        }
    }
    if (s.w <= eps) printf("chu ti ren shi zhi zhang");
    else printf("%.3f", s.w);
    return 0;
}

原文地址:https://www.cnblogs.com/Agakiss/p/11621944.html

时间: 2024-09-28 12:55:01

[10.4模拟赛]T2的相关文章

10.2模拟赛总结

10.2 模拟赛总结 T1. 数位dp: 一个非常非常非常非常显然的数位 DP \([L,R] = [1,R]-[1,L-1]\) 所以是分别求两次小于等于某个数字的方案数 \(f(i,j,k)\) 表示从低位数起的第 \(i\) 位,按照规则计算后答案为 \(j\quad (j=0,1)\) \(k\) 表示只考虑后面结尾和 \(lmt\)后面几位 的大小关系 \((k=0,1)\) 考虑第 \(i+1\) 位,算一下新构成的数字并判断下大小就可以了 注意到 \(L,R\) 数据范围特别大,需

10.22 模拟赛

10.22 模拟赛 T1 染色 考虑每个连通块删成一棵树就好了. mmp场上就我路径压缩写炸.... #include<iostream> #define MAXN 200006 using namespace std; int n , m; int fa[MAXN] , siz[MAXN] , book[MAXN] , sz[MAXN]; int find(int x) { return x == fa[x] ? x : fa[x] = find(fa[x]); } int main() {

10.31 模拟赛

10.31 模拟赛 A LIS 考虑每个数字前从 $ m $ 降序构造到 $ a_i $ 即可. #include <iostream> #include<algorithm> #include<cstring> #include<cstdio> #include<vector> using namespace std; #define MAXN 300006 int n , m , k; int A[MAXN]; vector<int&g

10.5模拟赛

这么多模拟赛都没整理,能整理一天算一天吧qaq T1题面 sol:应该不难吧,分别对横坐标和纵坐标取差的绝对值,易知:如果互质就可以看到,否则就不行.然后出题人很毒瘤要用unsigned long long. #include <cstdio> #include <algorithm> using namespace std; long long x1,y1,x2,y2,c1=0,c2=0; unsigned long long x,y; unsigned long long AB

10 01模拟赛订正

好吧,这是我第一次写模拟赛的订正,主要是有时间而且这次的题确实好... 第一题确实好,用的算法人人都会,就是看你能不能想到,我考只打了O(n^4)的暴力,最后还苦逼的MLE,爆零了... 暴力就不多说了...枚举两个点更新其他的点... 其实我考场上思考的是,能被标记的点都与其他的点有什么联系,可惜,除了模拟题目的做法,就不会了... 那让我们就认真地思考一发:我们设A(x1,x2),B(x2,c2),C(x3,c3)来更新D点,只有:有两个点横坐标相等,有两个点纵坐标相等,才可以更新出来一个新

2017 9 11 noip模拟赛T2

#include<cstdio> #include<cstring> #include<algorithm> using namespace std; const int N=205; int map[N][N]; int d[N],tag[N],book[N],f[N]; int n,m; void work(int x) { memset(d,63,sizeof(d)); memset(book,0,sizeof(book)); memset(f,0,sizeof(

10.1 模拟赛

由于算错了inf 又ak失败了 过于菜 T1 年轮蛋糕 loj 2758 题目大意: n个数构成的环 把这个环分成三段 使最小的最大 求这个最小段的和的最大值 思路: 可以想到二分 因为log方可以过 所以可以二分长度后lower_bound找断点 或者使用滑动窗口 1 #include<iostream> 2 #include<cstdio> 3 #include<cstring> 4 #include<cstdlib> 5 #include<cma

10.27 模拟赛

这一次终极被吊打 甚至没进前十 T2 最后改错 T3 没写正解 T1 elim 题目大意: n 行 m 列的游戏棋盘,一行或一列上有连续 三个或更多的相同颜色的棋子时,这些棋子都被消除 当有多处可以被消除时,这些地方的棋子将同时被消除 求消除后的棋盘 思路: sb模拟 1 #include<iostream> 2 #include<cstdio> 3 #include<cstring> 4 #include<cstdlib> 5 #include<cm

10.4 模拟赛

写在前面: 我发现我每一次写题解都是改题改不出来了QAQ 其实今天的题都还好啦. T1 可见点数 其实就是 luogu仪仗队 的数据扩大版,开个long long然后数组开大点就可以过了. T2 射击 这个题就很有意思了. 小W和他的东厂厂长叔叔去打窗户.... 其中两句话很有误导的含义,不少人都死在了这句话上面.[其实只有我 /滑稽 每秒只能彻底打破一扇窗户. 你不能要求他们叔侄两个打破不同的窗户获得的快乐值必须相同. 错误的贪心策略: 把所有的窗户按时间排序,时间相同按价值排序,然后模拟选择