hard_learn @ 2024-08-30 08:59:24
#include<bits/stdc++.h>
#define int long long
using namespace std;
int n,m,ans=0;
struct st{
int c,step;
};
struct node{
int id,x;
bool operator <(const node&h)const{
return x<h.x;
}
};
vector<st>sum[1000006],cnt[1000006];
int dis[1000006];
bool flag[1000006];
void dij(int x){
priority_queue<node>q;
for(int i=1;i<=n;i++){
dis[i]=INT_MAX;
flag[i]=0;
}
dis[x]=0;
flag[x]=1;
q.push((node){x,0});
while(q.empty()==0){
int now=q.top().id;
q.pop();
for(int i=0;i<sum[now].size();i++){
int tt=sum[now][i].step,id=sum[now][i].c;
if(dis[id]>dis[now]+tt){
dis[id]=dis[now]+tt;
if(flag[id]==0){
flag[id]=1;
q.push((node){id,dis[id]});
}
}
}
}
}
void dijs(int x){
priority_queue<node>q;
for(int i=1;i<=n;i++){
dis[i]=INT_MAX;
flag[i]=0;
}
dis[x]=0;
flag[x]=1;
q.push((node){x,0});
while(q.empty()==0){
int now=q.top().id;
q.pop();
for(int i=0;i<cnt[now].size();i++){
int tt=cnt[now][i].step,id=cnt[now][i].c;
if(dis[id]>dis[now]+tt){
dis[id]=dis[now]+tt;
if(flag[id]==0){
flag[id]=1;
q.push((node){id,dis[id]});
}
}
}
}
}
signed main(){
ios::sync_with_stdio(0);
cin.tie(0);cout.tie(0);
cin>>n>>m;
for(int i=1;i<=m;i++){
int u,v,w;
cin>>u>>v>>w;
sum[u].push_back((st){v,w});
cnt[v].push_back((st){u,w});
}
dij(1);
for(int i=1;i<=n;i++){
ans+=dis[i];
}
dijs(1);
for(int i=1;i<=n;i++){
ans+=dis[i];
}
cout<<ans<<endl;
return 0;
}
by tzhengqing @ 2024-08-30 09:29:07
大早上的。。。
by hard_learn @ 2024-08-30 12:06:11
@tzhengqing 没事干,你帮我看一下
by hard_learn @ 2024-08-30 13:05:40
@saltfish
by djh456789123 @ 2024-12-04 23:59:23
你的djst中只能进一次,这是不太对的,如果一个点的刚开始在特别进了,但特远,后面根据其他点跳过来,他还要再能进,只是出来的时候保证一个点第一次出来最小