求助站外
  • 板块学术版
  • 楼主formu1
  • 当前回复3
  • 已保存回复3
  • 发布时间2023/3/8 11:17
  • 上次更新2023/10/23 22:43:17
查看原帖
求助站外
522930
formu1楼主2023/3/8 11:17

POJ - 1511

#include<cstdio>
#include<algorithm>
#include<queue>
#include<cstring>
using namespace std;
typedef pair<long long,long long> PII;
const long long maxn=1000005;
long long n,m;
struct node{
	long long _this,next,w;
	node(){
		_this=next=w=0;
	}
}To[maxn<<1],Come[maxn<<1];
long long headnextTo[maxn],headnextCome[maxn];
long long idxTo,idxCome;
void merge(long long from,long long to,long long w,long long T){
	if(T==0){
		To[++idxTo]._this=to;
		To[idxTo].w=w;
		To[idxTo].next=headnextTo[from];
		headnextTo[from]=idxTo;
	}
	else{
		Come[++idxCome]._this=to;
		Come[idxCome].w=w;
		Come[idxCome].next=headnextCome[from];
		headnextCome[from]=idxCome;
	}
}
long long dis[maxn];
bool vis[maxn];
long long ans;
priority_queue<PII,vector<PII>,greater<PII> > heap;
long long dij(long long from){
	while(!heap.empty()) heap.pop();
	memset(dis,0x3f3f3f3f,sizeof dis);
	memset(vis,0,sizeof vis);
	dis[from]=0;
	heap.push(make_pair(0,from));
	while(heap.size()){
		long long nowid=heap.top().second;
		long long nowdis=heap.top().first;
		heap.pop();
		if(vis[nowid]) continue;
		vis[nowid]=1;
		for(long long i=headnextTo[nowid];i!=0;i=To[i].next){
			long long _try=To[i]._this;
			if(dis[_try]>nowdis+To[i].w){
				dis[_try]=nowdis+To[i].w;
				heap.push(make_pair(dis[_try],_try));
			}
		}
	}
	for(long long i=2;i<=n;++i){
		ans+=dis[i];
	}
	
	
	while(!heap.empty()) heap.pop();
	memset(dis,0x3f3f3f3f,sizeof dis);
	memset(vis,0,sizeof vis);
	dis[from]=0;
	heap.push(make_pair(0,from));
	while(heap.size()){
		long long nowid=heap.top().second;
		long long nowdis=heap.top().first;
		heap.pop();
		if(vis[nowid]) continue;
		vis[nowid]=1;
		for(long long i=headnextCome[nowid];i!=0;i=Come[i].next){
			long long _try=Come[i]._this;
			if(dis[_try]>nowdis+Come[i].w){
				dis[_try]=nowdis+Come[i].w;
				heap.push(make_pair(dis[_try],_try));
			}
		}
	}
	for(long long i=2;i<=n;++i){
		ans+=dis[i];
	}
	return ans;
}
int main(){
	long long _;
	scanf("%lld",&_);
	while(_--){
		memset(headnextTo,0,sizeof headnextTo);
		memset(headnextCome,0,sizeof headnextCome);
		idxTo=idxCome=ans=0;
		scanf("%lld%lld",&n,&m);
		for(long long i=1;i<=m;++i){
			long long s,t,w;
			scanf("%lld%lld%lld",&s,&t,&w);
			merge(s,t,w,0);
			merge(t,s,w,1);
		}
		printf("%lld\n",dij(1));
	}
	return 0;
}
2023/3/8 11:17
加载中...