P1629 Dijkstra 50ptsTLE求助!!
#include<bits/stdc++.h>
#define int long long
using namespace std;
int n,m,s,dis[1010][1010],vis[100010];
vector<pair<int,int> >G[500010];
void Dijkstra(int s){
memset(vis,0,sizeof(vis));
priority_queue<pair<int,int>,vector<pair<int,int> >,greater<pair<int,int> > >q; //first是距离 second是到达点
dis[s][s] = 0;
q.push(make_pair(0,s));
while (!q.empty()) {
pair<int,int>u = q.top();
q.pop();
int x = u.second;
if (vis[x]) continue;
vis[x] = 1;
for (unsigned i = 0;i < G[x].size();i ++) {
int y = G[x][i].first;
if (dis[s][y] > dis[s][x] + G[x][i].second) {
dis[s][y] = dis[s][x] + G[x][i].second;
if (!vis[y]) {
q.push(make_pair(dis[s][y],y));
}
}
}
}
}
signed main() {
cin >> n >> m;
memset(dis,0x3f,sizeof(dis));
for (int i = 1;i <= m;i ++) {
int u,v,w;
cin >> u >> v >> w;
G[u].push_back(make_pair(v,w));
}
for (int i = 1;i <= n;i ++) {
Dijkstra(i);
}
int sum = 0;
for (int i = 2;i <= n;i ++) {
sum += dis[1][i];
sum += dis[i][1];
}
cout << sum << endl;
return 0;
}