90pts,第二个点WA, 求解!
查看原帖
90pts,第二个点WA, 求解!
312605
Megumimwf楼主2023/2/11 22:50

一直都是99,数出来应该是75

#include<bits/stdc++.h>
#define ll long long
using namespace std;

inline ll read(){
	ll x=0, f=1;
	char ch=getchar();
	while(ch<'0' || ch>'9'){
		if(ch == '-'){
			f = -1;
		}
		ch = getchar();
	}
	while(ch>='0' && ch<='9'){
		x = x * 10 + ch - 48;
		ch = getchar();
	}
	return x * f;
}

struct edge{
	ll to, dis;
};
edge e;
ll n, m, u, v, w, dis[1000086], vis[1000086], temp, ans;
vector<edge> a[10086], b[10086];

inline void dijkstra_back(){
	memset(dis, 0x3f7f, sizeof(dis));
	memset(vis, 0, sizeof(vis));
	for(int i=0;i<b[1].size();++i){
		dis[b[1][i].to] = b[1][i].dis;
	}
	dis[1] = 0, vis[1] = 1;
	for(int i=2;i<=n;++i){
		temp = INT_MAX;
		for(int j=1;j<=n;++j){
			if(!vis[j] && dis[j] < temp){
				temp = dis[j];
				u = j;
			}
		}
		vis[u] = 1;
		for(int j=0;j<b[u].size();++j){
			dis[b[u][j].to] = min(dis[b[u][j].to], b[u][j].dis+dis[u]);
		}
	}
}

inline void dijkstra_go(){
	memset(dis, 0x3f3f, sizeof(dis));
	memset(vis, 0, sizeof(vis));
	for(int i=0;i<a[1].size();++i){
		dis[a[1][i].to] = a[1][i].dis;
	}
	dis[1] = 0, vis[1] = 1;
	for(int i=2;i<=n;++i){
		temp = INT_MAX;
		for(int j=1;j<=n;++j){
			if(!vis[j] && temp > dis[j]){
				temp = dis[j];
				u = j;
			}
		}
		vis[u] = 1;
		for(int j=0;j<a[u].size(); ++j){
			dis[a[u][j].to] = min(dis[a[u][j].to], dis[u]+a[u][j].dis);
		}
	}
}

int main(){
	n = read(), m = read();
	for(int i=1;i<=m;++i){
		u = read(), v = read(), w = read();
		e.to = v;
		e.dis = w;
		a[u].push_back(e);
		e.to = u;
		b[v].push_back(e);
	}
	dijkstra_go();
	for(int i=1;i<=n;++i){
		ans += dis[i];
	}	
	dijkstra_back();
	for(int i=1;i<=n;++i){
		ans += dis[i];
	}
	cout<<ans;	
	return 0;
}
2023/2/11 22:50
加载中...