• 洛谷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; 
    }
    
    孤注一掷,我怎甘落空?!
  • 相关阅读:
    linux服务器NAT后无法在内网通过外部IP访问内部服务的问题
    Centos7离线部署docker
    centos7运维记录文档
    centos7离线部署Patroni
    nginx常用运维日志分析命令
    Ubuntu只读文件系统修复方法
    pm2常用命令
    Expert 诊断优化系列------------------锁是个大角色
    Expert 诊断优化系列------------------给TempDB 降温
    Expert 诊断优化系列------------------透过等待看系统
  • 原文地址:https://www.cnblogs.com/grcyh/p/10134347.html
Copyright © 2020-2023  润新知