zoukankan      html  css  js  c++  java
  • 洛谷P2939 [USACO09FEB]改造路Revamping Trails

    题意翻译

    约翰一共有(N))个牧场.由(M)条布满尘埃的小径连接.小径可 以双向通行.每天早上约翰从牧场(1)出发到牧场(N)去给奶牛检查身体.

    通过每条小径都需要消耗一定的时间.约翰打算升级其中(K)条小径,使之成为高 速公路.在高速公路上的通行几乎是瞬间完成的,所以高速公路的通行时间为(0).

    请帮助约翰决定对哪些小径进行升级,使他每天从(1)号牧场到第(N)号牧场所花的时间最短

    题目描述

    Farmer John dutifully checks on the cows every day. He traverses some of the (M (1 <= M <= 50,000)) trails conveniently numbered (1..M) from pasture (1) all the way out to pasture (N) (a journey which is always possible for trail maps given in the test data). The (N) ((1 <= N <= 10,000)) pastures conveniently numbered (1..N) on Farmer John's farm are currently connected by bidirectional dirt trails. Each trail i connects pastures (P1_i) and (P2_i) ((1 <= P1_i <= N; 1 <= P2_i <= N)) and requires (T_i) ((1 <= T_i <= 1,000,000)) units of time to traverse.

    He wants to revamp some of the trails on his farm to save time on his long journey. Specifically, he will choose (K) ((1 <= K <= 20)) trails to turn into highways, which will effectively reduce the trail's traversal time to (0). Help FJ decide which trails to revamp to minimize the resulting time of getting from pasture (1) to (N).

    TIME LIMIT: (2) seconds

    输入输出格式

    输入格式:

    • Line (1): Three space-separated integers: (N, M), and (K)

    • Lines (2..M+1): Line (i+1) describes trail i with three space-separated integers: (P1_i, P2_i), and (T_i)

    输出格式:

    • Line (1): The length of the shortest path after revamping no more than (K) edges

    输入输出样例

    输入样例#1:

    4 4 1 
    1 2 10 
    2 4 10 
    1 3 1 
    3 4 100 
    

    输出样例#1:

    1 
    

    说明

    (K) is (1); revamp trail (3->4) to take time (0) instead of (100). The new shortest path is (1->3->4), total traversal time now (1).

    思路:依旧是分层最短路,这次的分层最短是的(k)是有(k)次可以不花费任何代价去走一条路,那么我们把图分为(n)层,每条边连向映射点与原来边的起来的距离为(0),然后跑(dijkstra),就做完了。

    代码:

    #include<cstdio>
    #include<cstring>
    #include<queue>
    #include<algorithm>
    #include<cctype>
    #define maxn 5000001
    using namespace std;
    int n,m,k,head[maxn],num,dis[maxn],s,t;
    inline int qread() {
      char c=getchar();int num=0,f=1;
      for(;!isdigit(c);c=getchar()) if(c=='-') f=-1;
      for(;isdigit(c);c=getchar()) num=num*10+c-'0';return num*f;
    }
    struct Edge {
      int v,w,nxt;
    }e[maxn];
    struct node {
      int x,y;
      bool operator < (const node &a) const {return y>a.y;}
    };
    inline void ct(int u, int v, int w) {
      e[++num].v=v;
      e[num].w=w;
      e[num].nxt=head[u];
      head[u]=num;
    }
    priority_queue<node>q;
    inline void dijkstra() {
      memset(dis,0x3f,sizeof(dis));
      dis[1+n*k]=0;q.push((node){1+n*k,0});
      while(!q.empty()) {
      	int u=q.top().x,d=q.top().y;
      	q.pop();
      	if(d!=dis[u]) continue;
      	for(int i=head[u];i;i=e[i].nxt) {
      	  int v=e[i].v;
    	  if(dis[v]>dis[u]+e[i].w) {
    	  	dis[v]=dis[u]+e[i].w;
    	  	q.push((node){v,dis[v]});
    	  }	
    	}
      }
    }
    int main() {
      n=qread(),m=qread(),k=qread();
      for(int i=1,u,v,w;i<=m;++i) {
      	u=qread(),v=qread(),w=qread();
      	for(int j=0;j<=k;++j) {
      	  ct(u+j*n,v+j*n,w);
    	  ct(v+j*n,u+j*n,w);
    	  if(j) {
    	  	ct(u+j*n,v+(j-1)*n,0);
    	  	ct(v+j*n,u+(j-1)*n,0);
    	  }	
    	}
      }
      dijkstra();
      int zrj=0x7fffffff;
      for(int i=0;i<=k;++i) zrj=min(zrj,dis[n+i*n]);
      printf("%d
    ",zrj);
      return 0; 
    }
    
    孤注一掷,我怎甘落空?!
  • 相关阅读:
    程序员面试中有几大法则
    实现立方体旋转
    为什么技术与产品沟通起来总是那么痛苦
    移动互联网下半场的面试真经,让你进入 BAT 不再是梦
    Javascript+H5实现打小地鼠游戏
    Python多进程应用
    Python数据分析笔记:聚类算法之K均值
    给新手程序员的16个工作必备小妙招,省下时间去LOL吧!
    MySQL数据库开发常见问题及优化
    java中的四种引用类型
  • 原文地址:https://www.cnblogs.com/grcyh/p/10134347.html
Copyright © 2011-2022 走看看