样例,全WA求助
查看原帖
样例,全WA求助
690301
Liwier楼主2022/9/8 22:05

可能写的有些繁琐,望谅解

#include <bits/stdc++.h>
#define m_p make_pair
using namespace std;
typedef pair<int,int> pix;
int n,m; 
struct cmp{
	bool operator()(const pix a,const pix b){
		return a.first>b.first;
	}
};
struct ntoe{
	int v,w,next;
}e[1000100];
struct nott{
	int v,w,next;
}e2[1000100]; 
int head[1000100],k = 1;
int head2[1000100],k2 = 1;
void add(int u,int v,int w){
	e[k].v = v;
	e[k].w = w;
	e[k].next = head[u];
	head[u] = k++;
}
void add2(int u,int v,int w){
	e2[k2].v = v;
	e2[k2].w = w;
	e2[k2].next = head2[u];
	head2[u] = k2++;
}
int dis[1000100];
int dis2[1000100];
bool vis2[1000100]; 
bool vis[1000100];
void dij(int s){
	for(int i =1;i<=n;i++){
		dis[i] = 0x3f3f3f3f;
	}
	dis[s] = 0;
	priority_queue<pix,vector<pix>,cmp> q;
	q.push(m_p(dis[s],s));
	while(!q.empty()){
		pix tmp = q.top();
		q.pop();
	//	cout<<tmp.first<<" "<<tmp.second<<endl;
		int u = tmp.second;
		if(vis[u])continue;
		vis[u] =1;
		for(int i = head[u];i!=0;i=e[i].next){
			int v=  e[i].v;
			int w = e[i].w;
			if(dis[v]>dis[u]+w){
				dis[v] = dis[u]+w;
				q.push(m_p(dis[v],v));
			}
		}
	}

	return;
}
void dij2(int s){
	for(int i = 1;i<=n;i++){
		dis2[i] = 0x3f3f3f3f;
	}
	dis2[s] = 0;
	priority_queue<pix,vector<pix>,cmp> q2;
	q2.push(m_p(dis2[s],s));
	while(!q2.empty()){
		pix tmp = q2.top();
		q2.pop();
		int u = tmp.second;
		if(vis2[u])continue;
		vis2[u] = 1;
		for(int i =head2[u];i != 0;i = e2[i].next){
			int v = e2[i].v;
			int w = e2[i].w;
			if(dis2[v]>dis2[u]+w){
				dis2[v] = dis2[u]+w;
				q2.push(m_p(dis2[v],v));
			}
		}
	}
	return ;
}
int main(){
	int s;
	cin>>n>>m;
	s = 1;
	for(int i = 1;i<=m;i++){
		int t1,t2,t3;
		scanf("%d%d%d",&t1,&t2,&t3); 
		add(t1,t2,t3);
		add2(t2,t1,t3);
	}
	dij(s);
	dij2(s);
	long long ans;
	for(int i =1;i<=n;i++){
		ans+=dis[i];
	//	cout<<dis[i]<<":"<<dis2[i]<<" "<<endl;
		ans+=dis2[i];
	}
	cout<<ans; 
	return 0;
} 
2022/9/8 22:05
加载中...