题 解 CF449B 【】 Jzzhu y ciudades

Este es uno de los más problema de cortocircuito, y se ve como un SPFA sospechoso muerto.

SPFA muertos, Dijkstra en el poder!


Sobre esta cuestión, el preexistente imagen buena, a continuación, lea estos ventaja especial. En el proceso de lectura, hacer algo de procesamiento, la fuente única más corta tomar una \ (\ min {DIS [V], valor} \) , la grabación simultánea cuántos repitió borde especial, y estos puntos ahorrado, añadido al montón en.

Estos borde especial ineficaz repetido debe ser bien entendido.

A continuación, ejecute de nuevo Dijkstra, una nota de cuántos de éstos borde especial de la madeja (se refiere a la sustitución de otras maneras más cortocircuitado el estado de la TA). Tenga en cuenta que este no es el aumento en el número de respuestas , pero si este lado se registra el volumen de negocios a cabo . (Tengo un montón de tiempo porque el Qaq melodía.

Junto con un mango en el menor porque sólo asegúrese de que este borde es inútil, a continuación, para el punto más corto en la necesidad de actualizar continuamente, por lo que puede saltar fuera de la parte superior de la pila (pro-prueba puede prevenir MLE).

Por último, para el punto de registró de nuevo por encima, incluso si la madeja a un lado de modo especial este punto se incrementó el número de respuestas.

Debido a que la pila utilizada para optimizar Dijkstra, por lo que utiliza una operación de par, no sé ir a la derecha floración. (Para tomar prestado un par de terminar notas de un gángster, donde sto TA orz)

De acuerdo, aquí está el código:

#include<bits/stdc++.h>
#define pi pair<int,int>
#define mp make_pair
#define F first
#define S second
#define re register
using namespace std;

int n,m,k,dis[100005],sum,ans;
bool vis[100005],ud[600005];
priority_queue< pi > q;
vector<int> v;
int h[100005],cnt;

struct node {//链式前向星存边
	int to,nxt,cost;
} b[600005];

void add(int x,int y,int z) {//加边操作
	b[++cnt].nxt=h[x];
	b[cnt].to=y;
	b[cnt].cost=z;
	h[x]=cnt;
}

inline int read() {//快读
	int sum=0,w=1;
	char ch=getchar();
	while(ch<'0'||ch>'9') {
		if(ch=='-') w=-1;
		ch=getchar();
	}
	while(ch>='0'&&ch<='9') {
		sum=(sum<<3)+(sum<<1)+ch-'0';
		ch=getchar();
	}
	return sum*w;
}

int main() {
	n=read();
	m=read();
	k=read();
	for(re int i=1; i<=m; ++i) {
		int a,b,c;
		a=read();
		b=read();
		c=read();
		add(a,b,c);
		add(b,a,c);
	}
	memset(dis,0x3f,sizeof(dis));
	for(re int i=1; i<=k; ++i) {
		int v,c;
		v=read();
		c=read();
		if(dis[v]!=0x3f3f3f3f) ++ans;//记录重复边
		dis[v]=min(dis[v],c);
	}
	for(int i=1; i<=n; i++) {
		if(dis[i]!=0x3f3f3f3f) {
			v.push_back(i);
			q.push(mp(-dis[i],i));
		}
	}
	dis[1]=0;
	vis[1]=1;
	q.push(mp(0,1));
	while(q.size()) {
		pi u=q.top();
		q.pop();
		vis[u.S]=1;
		for(re int i=h[u.S]; i; i=b[i].nxt) {
			int v=b[i].to,cost=b[i].cost;
			if(dis[v]>=dis[u.S]+cost) {
				dis[v]=dis[u.S]+cost;
				ud[v]=1;//记录被hank掉的边
				q.push(mp(-dis[v],v));
			}
		}
		while(q.size()&&vis[q.top().S]) q.pop();//跳出堆顶操作
	}
	for(re int i=0; i<v.size(); i++) {
		if(ud[v[i]]) ++ans;//二次更新答案数
	}
	printf("%d",ans);
	return 0;
}

Supongo que te gusta

Origin www.cnblogs.com/ahawzlc/p/12599525.html
Recomendado
Clasificación