2 条题解
-
1
备注: ******************************************/ #include <queue> #include <math.h> #include <stack> #include <stdio.h> #include <iostream> #include <vector> #include <iomanip> #include <string.h> #include <algorithm> #include <map> using namespace std; #define LL long long const int N = 1e6 + 10; const int INF = 0x3f3f3f3f; int n, m; int head[N], ne[N], to[N], w[N], id; int dis[N], vis[N]; void add(int x, int y, int z) { to[++id] = y, w[id] = z, ne[id] = head[x], head[x] = id; } struct node { int id, num; bool operator <(const node &a)const { return num > a.num; } }; void dij() { priority_queue<node> p; p.push((node){1, 0}); p.push((node){n+1, 0}); dis[1] = dis[n+1] = 0; while(!p.empty()) { node t = p.top(); p.pop(); if(vis[t.id] || dis[t.id] != t.num) continue; vis[t.id] = 1; for(int i = head[t.id]; i; i = ne[i]) { int v = to[i]; if(!vis[v] && dis[v] > dis[t.id] + w[i]) { dis[v] = dis[t.id] + w[i]; p.push((node){v, dis[v]}); } } } } signed main() { //freopen(".in", "r", stdin); //freopen(".out", "w", stdout); memset(dis, 0x3f, sizeof dis); cin>>n>>m; for(int i = 1, x, y, z; i <= m; i++) { cin>>x>>y>>z; add(x, y ,z); add(y + n, x + n, z); } dij(); int ans = 0; for(int i = 1; i <= 2*n; i++) { ans += dis[i]; } cout<<ans<<endl; return 0; }
信息
- ID
- 410
- 时间
- 1000ms
- 内存
- 256MiB
- 难度
- 6
- 标签
- 递交数
- 75
- 已通过
- 25
- 上传者