RT
查看原帖
RT
744562
Aya_tt楼主2022/10/3 22:56

太久没写,竟然最短路都不会了。

#include<bits/stdc++.h>
using namespace std;
const int N = 2e5 + 10;
int n, m, cnt, head[N], ans, dis[N], vis[N];
struct kkk{
	int to, nxt, w;
}edge[N];
void add(int x,int y,int z){
	edge[++cnt].to = y;
	edge[cnt].w = z;
	edge[cnt].nxt = head[x];
	head[x] = cnt;
}
struct Node{
	int dis, id;
	bool operator < (const Node &x)const{
		return x.dis < dis;
	}
};
void init(){
	for(int i = 1;i <= 2 * n;i++){
		dis[i] = 0x3f3f3f3f;
	}
}
priority_queue<Node> q;
void dijkstra(int s){
	memset(head, -1, sizeof head);
	memset(vis, 0, sizeof vis);	
	init();
	q.push((Node){0, s});
	dis[s] = 0;
	vis[s] = 1;
	while(!q.empty()){
		Node temp = q.top();
		q.pop();
		int u = temp.id;
		if(!vis[u]){
			vis[u] = 1;
			for(int i = head[u];i;i = edge[i].nxt){
				int v = edge[i].to;
				if(dis[v] > dis[u] + edge[i].w){
					dis[v] = dis[u] + edge[i].w;
					if(!vis[v]){
						q.push((Node){dis[v], v});
					}
				}
			}
		}
	}
} 
int main(){
	cin >> n >> m;
	for(int i = 1;i <= m;i++){
		int u, v, w;
		cin >> u >> v >> w;
		add(u, v, w);
		add(v + n, u + n, w);	
	}
	dijkstra(1);
	for(int i = 1;i <= n;i++){
		ans += dis[i];
	}
	while(!q.empty()){
		q.pop();
	}
    dijkstra(1 + n);
    for(int i = 1 + n;i <= n * 2;i++){
		ans += dis[i];
	}
	cout << ans;
}
2022/10/3 22:56
加载中...