列表

详情


NC24833. [USACO 2009 Feb G]Revamping Trails

描述

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.

输入描述

* 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

说明:

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.

原站题解

上次编辑到这里,代码来自缓存 点击恢复默认模板

C++11(clang++ 3.9) 解法, 执行用时: 252ms, 内存消耗: 53156K, 提交时间: 2019-12-03 21:24:47

#include<bits/stdc++.h>
using namespace std;
struct edge
{
	int net,to,w;
}e[6000005];
int h[400005],cnt,dis[400005];
int vis[400005];
inline void add(int x,int y,int z)
{
	e[++cnt]=(edge){h[x],y,z};
	h[x]=cnt;
}
struct node
{
	int x,dis;
};
struct cmp
{
	bool operator()(node a,node b)
	{
		return a.dis>b.dis;
	}
};
priority_queue<node,vector<node>,cmp> q;
int n,m,k,u,v,w;
signed main()
{
	scanf("%d%d%d",&n,&m,&k);
	for(int i=1;i<=m;i++)
	{
		scanf("%d%d%d",&u,&v,&w);
		for(int j=0;j<=k;j++)
		{
			add(u+j*n,v+j*n,w);
			add(v+j*n,u+j*n,w);
			add(u+j*n,v+(j+1)*n,0),add(v+j*n,u+(j+1)*n,0);
		}
	}
	memset(dis,127/3,sizeof(dis));
	dis[1]=0;
	q.push((node){1,0});
	while(!q.empty())
	{
		node k=q.top();
		q.pop();
		if(vis[k.x]) continue;
		vis[k.x]=1;
		for(int i=h[k.x];i;i=e[i].net)
		{
			int y=e[i].to;
			if(dis[y]>dis[k.x]+e[i].w) 
			{
				dis[y]=dis[k.x]+e[i].w;
				q.push((node){y,dis[y]});
			}
		}
	}
	printf("%d",dis[n+k*n]);
	return 0;
}

上一题