洛 谷 P2939 [USACO09FEB] Revamping Senderos G

título

título

John, un total de N rancho). Cubierto por el polvo de la conexión rastro M. Senderos pueden ser de dos vías de tráfico. Cada mañana John de rancho en rancho 1 a N vacas examen físico.
A través de las necesidades de cada rastro de consumir una cierta cantidad de tiempo. John K, que tiene la intención de actualizar la pista, por lo que es una autopista. tráfico en la carretera es casi instantánea, por lo que el paso del tiempo la carretera es 0.
ayuda por favor, John decidir qué senderos para actualizar, le hacen todos los días desde el 1 de No. No. N rancho en rancho pasó el tiempo más corto

código

vista jerárquica estándar de
prestar atención al utilizar la pila optimizada Dijkstra, con SPFA volará T

#include <iostream>
#include <utility>
#include <cstring>
#include <queue>
#define mp(x,y) make_pair(x,y)

using namespace std;
const int N=1E5*70,M=5E7;
int to[M],val[M],nxt[M],head[N],cnt;
int dist[N];
bool vis[N];
int n,m,k;

void add(int u,int v,int w) {
	to[++cnt]=v;
	val[cnt]=w;
	nxt[cnt]=head[u];
	head[u]=cnt;
}

void dijkstra() {   //这题卡SPFA,只能用堆优化的Dijkstra
	memset(dist,0x3f,sizeof(dist));
	dist[1]=0;
	priority_queue<pair<int,int> > q;
	q.push(mp(0,1));
	while(!q.empty()) {
		int x=q.top().second;
		q.pop();
		vis[x]=true;
		for(int i=head[x];i;i=nxt[i]) {
			int y=to[i],w=val[i];
			if(dist[y]>dist[x]+w) {
				dist[y]=dist[x]+w;
				if(!vis[y])
				  q.push(mp(-dist[y],y));
			}
		}
	}
}

int main() {
	cin>>n>>m>>k;
	while(m--) {
		int u,v,w;
		cin>>u>>v>>w;
		add(u,v,w);
		add(v,u,w);
		for(int j=1;j<=k;j++) {
			add(v+j*n,u+j*n,w);
			add(u+j*n,v+j*n,w);
			add(v+j*n-n,u+j*n,0);
			add(u+j*n-n,v+j*n,0);
		}
	}
	dijkstra();
	int ans=0x7fffffff; //防极品数据
	for(int i=1;i<=k;i++)
	  ans=min(ans,dist[i*n+n]);
	cout<<ans;
	return 0;
}

Supongo que te gusta

Origin www.cnblogs.com/wyc06/p/12641813.html
Recomendado
Clasificación