求解,用数组存数据然后正反各跑一遍dijkstra,过了样例,10分
查看原帖
求解,用数组存数据然后正反各跑一遍dijkstra,过了样例,10分
376467
QDHSLGYYJK楼主2020/11/5 17:32
#include<cstdio>
#include<cstring>
#include<queue>
using namespace std;
const int M=1e5+5,N=1e3+5;
struct al{
	int v,e;
};
bool operator <(const al &a,const al &b){
	return a.e>b.e;
}
priority_queue<al> q;
al a[M];
int nxt[M],h[N],d[N],tot;
bool b[N];
void add(int x,int y,int z);
void dijkstra();
int main(){
	int n,m,x[M],y[M],z[M];
	scanf("%d%d",&n,&m);
	for (int i=1;i<=m;++i){
		scanf("%d%d%d",&x[i],&y[i],&z[i]);
		add(x[i],y[i],z[i]);
	}
	dijkstra();
	int ans=0;
	for (int i=1;i<=n;++i)
		ans+=d[i];
	tot=0;
	memset(h,0,sizeof(h));
	memset(b,0,sizeof(b));
	for (int i=1;i<=m;++i)
		add(y[i],x[i],z[i]);
	dijkstra();
	for (int i=1;i<=n;++i)
		ans+=d[i];
	printf("%d",ans);
	return 0;
}
inline void add(int x,int y,int z){
	a[++tot].v=y;
	a[tot].e=z;
	nxt[tot]=h[x];
	h[x]=tot;
}
inline void dijkstra(){
	memset(d,0x3f,sizeof(d));
	d[1]=0;
	q.push((al){1,0}); 
	while (q.size()){
		al tmp;
		tmp=q.top();
		q.pop();
		if (b[tmp.v])
			continue;
		b[tmp.v]=1;
		for (int j=h[tmp.v];j;j=nxt[j])
			if (d[a[j].v]>d[tmp.v]+a[j].e){
				d[a[j].v]=d[tmp.v]+a[j].e;
				if (!b[a[j].v])
					q.push(a[j]);
			}
	}
}
2020/11/5 17:32
加载中...