spaf

#include<bits/stdc++.h>
using namespace std;
typedef long long ll;
#define INF 0x3f3f3f3f
const ll N=610000;
ll vis[21900];  //相当于bool函数
ll dis[21900],u[N],v[N],w[N];  
ll nxt[N],head[N];
ll n,m;
ll cnt=0;
struct node{
ll to,next,val;
}edge[N];
void add(ll x,ll y,ll z)
{
edge[++cnt].to=y;
edge[cnt].val=z;
edge[cnt].next=head[x];
head[x]=cnt;
}
void spfa(ll s)
{
memset(vis,0,sizeof(vis));
queue<ll> q;  //队列存放节点
q.push(s);     
vis[s]=1;        //初始值  bool标记1  距离为零  出发点
dis[s]=0;       
while(!q.empty())    
{
ll x=q.front();    //每次去头节点并删除    X=TOT
q.pop();
vis[x]=0;         // bool返回0
for (ll i=head[x];i!=-1;i=edge[i].next)       //节点对应的边
{
ll y=edge[i].to;                       //Y=TO
if (dis[y]>dis[x]+edge[i].val)       //  Y>X+VAL;
{
dis[y]=dis[x]+edge[i].val;
if (!vis[y])                                   // 如果节点返回0   则标记为1并放入队列;
{
vis[y]=1;
q.push(y);
}
}
}
}
}
int main()
{
ll t,i,k;
cin>>t;
while(t--)
{
ll sum=0;
cin>>n>>m;
memset(head,-1,sizeof(head));  //建造邻接表之前 初始化;
for(i=1;i<=m;i++)
{
scanf("%lld %lld %lld",&u[i],&v[i],&w[i]);  
add(u[i],v[i],w[i]);   
}
memset(dis,INF,sizeof(dis));   
dis[1]=0;
spfa(1);
for(ll j=1;j<=n;j++)
sum+=dis[j]; //前往


//回来
cnt=0;
memset(head,-1,sizeof(head));
memset(dis,INF,sizeof(dis));
dis[1]=0;
for(i=1;i<=m;i++)
{
add(v[i],u[i],w[i]);
}
spfa(1);
for(ll j=1;j<=n;j++)
sum+=dis[j];
printf("%lld\n",sum);

}
return 0;
}

 

posted @ 2022-04-20 18:08  xxj112  阅读(54)  评论(0)    收藏  举报