zoukankan      html  css  js  c++  java
  • 【BZOJ】1631: [Usaco2007 Feb]Cow Party(dijkstra)

    http://www.lydsy.com/JudgeOnline/problem.php?id=1631

    看到m<=100000果断用dij(可是好像dij比spfa还慢了在这里?)//upd:那是因为你写的根本不是dij,,233

    #include <cstdio>
    #include <cstring>
    #include <cmath>
    #include <string>
    #include <iostream>
    #include <algorithm>
    #include <queue>
    using namespace std;
    #define rep(i, n) for(int i=0; i<(n); ++i)
    #define for1(i,a,n) for(int i=(a);i<=(n);++i)
    #define for2(i,a,n) for(int i=(a);i<(n);++i)
    #define for3(i,a,n) for(int i=(a);i>=(n);--i)
    #define for4(i,a,n) for(int i=(a);i>(n);--i)
    #define CC(i,a) memset(i,a,sizeof(i))
    #define read(a) a=getint()
    #define print(a) printf("%d", a)
    #define dbg(x) cout << #x << " = " << x << endl
    #define printarr(a, n, m) rep(aaa, n) { rep(bbb, m) cout << a[aaa][bbb]; cout << endl; }
    inline const int getint() { int r=0, k=1; char c=getchar(); for(; c<'0'||c>'9'; c=getchar()) if(c=='-') k=-1; for(; c>='0'&&c<='9'; c=getchar()) r=r*10+c-'0'; return k*r; }
    inline const int max(const int &a, const int &b) { return a>b?a:b; }
    inline const int min(const int &a, const int &b) { return a<b?a:b; }
    
    const int N=1005, M=100005, oo=~0u>>2;
    int ihead[N], n, m, d[N], T, cnt, d1[N], X[M], Y[M], W[M];
    struct ED { int to, next, w; }e[M];
    struct ND { int id; const bool operator<(const ND &b) const { return d[id]>d[b.id]; } };
    priority_queue<ND> q;
    void add(int u, int v, int w) {
    	e[++cnt].next=ihead[u]; ihead[u]=cnt; e[cnt].to=v; e[cnt].w=w;
    }
    void dij(int s) {
    	for1(i, 0, n) d[i]=oo;
    	d[s]=0;
    	ND t={s};
    	int u, v;
    	q.push(t);
    	while(q.size()) {
    		u=q.top().id; q.pop();
    		for(int i=ihead[u]; i; i=e[i].next) if(d[v=e[i].to]>d[u]+e[i].w) {
    			d[v]=d[u]+e[i].w;
    			t.id=v;
    			q.push(t);
    		}
    	}
    }
    
    int main() {
    	read(n); read(m); read(T);
    	int u, v, w;
    	rep(i, m) {
    		read(u); read(v); read(w);
    		X[i]=u; Y[i]=v; W[i]=w;
    		add(v, u, w);
    	}
    	int mx=0;
    	dij(T);
    	for1(i, 1, n) d1[i]=d[i];
    	cnt=0; CC(ihead, 0);
    	rep(i, m) add(X[i], Y[i], W[i]);
    	dij(T);
    	for1(i, 1, n) {
    		mx=max(mx, d1[i]+d[i]);
    	}
    	print(mx);
    	return 0;
    
    }
    

    Description

        农场有N(1≤N≤1000)个牛棚,每个牛棚都有1只奶牛要参加在X牛棚举行的奶牛派对.共有M(1≤M≤100000)条单向路连接着牛棚,第i条踣需要Ti的时间来通过.牛们都很懒,所以不管是前去X牛棚参加派对还是返回住所,她们都采用了用时最少的路线.那么,用时最多的奶牛需要多少时间来回呢?

    Input

    第1行:三个用空格隔开的整数.

     第2行到第M+1行,每行三个用空格隔开的整数:Ai, Bi,以及Ti.表示一条道路的起点,终点和需要花费的时间.

    Output

    唯一一行:一个整数: 所有参加聚会的奶牛中,需要花费总时间的最大值.

    Sample Input

    4 8 2
    1 2 4
    1 3 2
    1 4 7
    2 1 1
    2 3 5
    3 1 2
    3 4 4
    4 2 3

    Sample Output

    10

    HINT

    样例说明:


    共有4只奶牛参加聚会,有8条路,聚会位于第2个农场.


    第4只奶牛可以直接到聚会所在地(花费3时间),然后返程路线经过第1和第3个农场(花费7时间),总共10时间.

    Source

  • 相关阅读:
    Eclipse JSP/Servlet 环境搭建
    2017 世界主要国家和地区 GDP 排名
    Twsited异步网络框架
    RabbitMQ队列,RedisMemcached缓存
    Paramiko,数据库
    SelectPollEpoll异步IO与事件驱动
    进程,线程,协程
    socketserver模块
    socket
    类的相关知识
  • 原文地址:https://www.cnblogs.com/iwtwiioi/p/3952795.html
Copyright © 2011-2022 走看看