zoukankan      html  css  js  c++  java
  • BZOJ 3040: 最短路(road)

    3040: 最短路(road)

    >原题链接<

    Description

    N个点,M条边的有向图,求点1到点N的最短路(保证存在)。
    1<=N<=1000000,1<=M<=10000000

    Input


    第一行两个整数N、M,表示点数和边数。
    第二行六个整数T、rxa、rxc、rya、ryc、rp。

    前T条边采用如下方式生成:
    1.初始化x=y=z=0。
    2.重复以下过程T次:
    x=(x*rxa+rxc)%rp;
    y=(y*rya+ryc)%rp;
    a=min(x%n+1,y%n+1);
    b=max(y%n+1,y%n+1);
    则有一条从a到b的,长度为1e8-100*a的有向边。

    后M-T条边采用读入方式:
    接下来M-T行每行三个整数x,y,z,表示一条从x到y长度为z的有向边。

    1<=x,y<=N,0<z,rxa,rxc,rya,ryc,rp<2^31

    Output


    一个整数,表示1~N的最短路。

    Sample Input

    3 3
    0 1 2 3 5 7
    1 2 1
    1 3 3
    2 3 1

    Sample Output

    2

    没什么思路吧,堆优化Dij即可过掉,注意前T条边因为X=Y=Z=0,所以一直都是给1自己连自环,跳过即可

    下面是代码。

    各位SPFA的大佬就不要尝试卡BZ啦!

    代码如下

    #include <cstdio>
    #include <cstring>
    #include <algorithm>
    #include <queue>
    using namespace std;
    const int N = 1000001;
    const int M = 10000001;
    #define mp(a,b) make_pair(a,b)
    #define ll long long
    #define sec second
    struct node {
        int next, to;
    	long long val;
    }e[M];
    int n, m, k;
    int head[N],vis[N],cnt;
    long long dis[N];
    void add_edge(int a,int b,long long c) {
        e[++cnt].to=b;
        e[cnt].val=c;
        e[cnt].next=head[a];
        head[a]=cnt;
    }
    priority_queue<pair<ll,int>,vector<pair<ll,int> >,greater<pair<ll,int> > >q;
    void dijstra() {
        memset(dis,0x3f,sizeof(dis));
        dis[1]=0;
        q.push(mp(0,1));
        while(!q.empty()) {
            int u=q.top().sec;
            q.pop();
            if(vis[u]) continue;
            vis[u]=1;
            for(int i=head[u];i;i=e[i].next) {
                if(dis[e[i].to]>dis[u]+e[i].val) {
                    dis[e[i].to]=dis[u]+e[i].val;
                    q.push(mp(dis[e[i].to],e[i].to));
                }
            }
        }
        printf("%lld
    ",dis[n]);
    }
    int main() {
    	scanf("%d%d%d%*d%*d%*d%*d%*d",&n,&m,&k);
    	for(int i=1;i<=m-k;i++) {
    		int x,y;
    		ll z;
    		scanf("%d%d%lld",&x,&y,&z);
    		add_edge(x,y,z);
    	}
    	dijstra();
    }
    

     欢迎来原博客看看 >原文链接<

  • 相关阅读:
    LeetCode 382. Linked List Random Node
    LeetCode 398. Random Pick Index
    LeetCode 1002. Find Common Characters
    LeetCode 498. Diagonal Traverse
    LeetCode 825. Friends Of Appropriate Ages
    LeetCode 824. Goat Latin
    LeetCode 896. Monotonic Array
    LeetCode 987. Vertical Order Traversal of a Binary Tree
    LeetCode 689. Maximum Sum of 3 Non-Overlapping Subarrays
    LeetCode 636. Exclusive Time of Functions
  • 原文地址:https://www.cnblogs.com/Tobichi/p/9107655.html
Copyright © 2011-2022 走看看