• HDU 6386 Age of Moyu 【BFS + 优先队列优化】


    任意门:http://acm.hdu.edu.cn/showproblem.php?pid=6386

    Age of Moyu

    Time Limit: 5000/2500 MS (Java/Others)    Memory Limit: 262144/262144 K (Java/Others)
    Total Submission(s): 3821    Accepted Submission(s): 1214


    Problem Description
    Mr.Quin love fishes so much and Mr.Quin’s city has a nautical system,consisiting of N ports and M shipping lines. The ports are numbered 1 to N. Each line is occupied by a Weitian. Each Weitian has an identification number.

    The i-th (1iM) line connects port Ai and Bi (AiBi) bidirectionally, and occupied by Ci Weitian (At most one line between two ports).

    When Mr.Quin only uses lines that are occupied by the same Weitian, the cost is 1 XiangXiangJi. Whenever Mr.Quin changes to a line that is occupied by a different Weitian from the current line, Mr.Quin is charged an additional cost of 1 XiangXiangJi. In a case where Mr.Quin changed from some Weitian A's line to another Weitian's line changes to Weitian A's line again, the additional cost is incurred again.

    Mr.Quin is now at port 1 and wants to travel to port N where live many fishes. Find the minimum required XiangXiangJi (If Mr.Quin can’t travel to port N, print 1instead)
     
    Input
    There might be multiple test cases, no more than 20. You need to read till the end of input.

    For each test case,In the first line, two integers N (2N100000) and M (0M200000), representing the number of ports and shipping lines in the city.

    In the following m lines, each contain three integers, the first and second representing two ends Ai and Bi of a shipping line (1Ai,BiN) and the third representing the identification number Ci (1Ci1000000) of Weitian who occupies this shipping line.
     
    Output
    For each test case output the minimum required cost. If Mr.Quin can’t travel to port N, output 1 instead.
     
    Sample Input
    3 3
    1 2 1
    1 3 2
    2 3 1
    2 0
    3 2
    1 2 1
    2 3 2
     
    Sample Output
    1
    -1
    2
     
    Source

    题意概括:

    N个点,M条无向边,每条边都有编号,经过相同的编号的边不会改变花费,经过不同的编号的边花费加一。

    解题思路:

    BFS 求最短路,用边替换点进队,按照花费升序排序。

    可能数据偏水,可以卡过去。

    AC code:

     1 #include <bits/stdc++.h>
     2 #define INF 0x3f3f3f3f
     3 #define LL long long
     4 using namespace std;
     5 
     6 const int MAXN = 1e5+10;
     7 bool vis[MAXN];
     8 int N, M;
     9 
    10 struct Edge
    11 {
    12     int nxt, no, v;
    13 }edge[MAXN<<2];
    14 int head[MAXN], tot;
    15 void init()
    16 {
    17     memset(vis, 0, sizeof(vis));
    18     memset(head, -1, sizeof(head));
    19     tot = 0;
    20 }
    21 
    22 void add(int a, int b, int no)
    23 {
    24     edge[tot].v = b;
    25     edge[tot].no = no;
    26     edge[tot].nxt = head[a];
    27     head[a] = tot++;
    28 }
    29 
    30 struct data
    31 {
    32     int u, v, cnt, type;
    33     bool operator < (const data &a) const {
    34         return cnt > a.cnt;
    35     }
    36 };
    37 
    38 
    39 int solve()
    40 {
    41     data x, y;
    42     int from, to, t, vv, sum;
    43     priority_queue<data>quq;
    44     for(int i = head[1]; i != -1; i = edge[i].nxt){
    45         x.u = 1;
    46         x.v = edge[i].v;
    47         x.cnt = 1;
    48         x.type = edge[i].no;
    49         quq.push(x);
    50     }
    51     vis[1] = true;
    52     while(!quq.empty()){
    53         x = quq.top();
    54         quq.pop();
    55         to = x.v;
    56         t = x.type;
    57         sum = x.cnt;
    58         if(to == N) return sum;
    59         vis[to] = true;
    60         for(int i = head[to]; i != -1; i = edge[i].nxt){
    61             vv = edge[i].v;
    62             if(vis[vv]) continue;
    63             if(edge[i].no != t) y.cnt = sum+1;
    64             else y.cnt = sum;
    65             y.v = vv;
    66             y.type = edge[i].no;
    67             quq.push(y);
    68         }
    69     }
    70     return -1;
    71 }
    72 
    73 int main()
    74 {
    75     int u, v, no;
    76     while(~scanf("%d %d", &N, &M)){
    77         init();
    78         for(int i = 1; i <= M; i++){
    79             scanf("%d %d %d", &u, &v, &no);
    80             add(u, v, no);
    81             add(v, u, no);
    82         }
    83 
    84         int ans = solve();
    85         printf("%d
    ", ans);
    86     }
    87     return 0;
    88 }
  • 相关阅读:
    线程的终止pthread_exit和返回为什么终止的原因
    临界区互斥使用之使用自旋锁
    临界区的同步操作-------------使用信号量 实现
    常用解压操作
    group compare vs pair compare
    两个总体的参数关系
    纳伪|去真
    Ho|H1|p-value|p值与U值|单侧检验
    统计分布近似转化
    样本均值的标准误差|样本均值的标准差|总体标准差|样本标准差|简单随机抽样|样本均值估计|样本方差估计|
  • 原文地址:https://www.cnblogs.com/ymzjj/p/10436476.html
Copyright © 2020-2023  润新知