题意为 从1出发到其他所有点 路费多少 再从各点回来 路费多少 两者相加
其他都是废话 比赛时题意就没理解
#include <stdio.h>
#include <vector>
#define N 9999999999
using namespace std;
struct node
{
int v;
int w;
};
vector <struct node> edge1[1000001];
vector <struct node> edge2[1000001];
long long dis[1000001];
long long sum1,sum2;
int book[1000001];
int n,m;
void calculate1();
void calculate2();
int main()
{
struct node t;
int i,j,a,b,c,tem;
scanf("%d",&tem);
while(tem--)
{
scanf("%d%d",&n,&m);
for(i=1;i<=n;i++)
{
edge1[i].clear();
edge2[i].clear();
}
for(i=1;i<=m;i++)
{
scanf("%d%d%d",&a,&b,&c);
t.v=b;
t.w=c;
edge1[a].push_back(t);
t.v=a;
t.w=c;
edge2[b].push_back(t);
}
sum1=0;
calculate1();
sum2=0;
calculate2();
printf("%lld\n",sum1+sum2);
}
return 0;
}
void calculate1()
{
struct node t;
long long minn;
int i,j,p;
for(i=1;i<=n;i++)
{
dis[i]=N;
book[i]=0;
}
dis[1]=0;
for(i=0;i<edge1[1].size();i++)
{
t=edge1[1][i];
dis[t.v]=t.w;
}
book[1]=1;
for(i=1;i<=n-1;i++)
{
minn=N;
for(j=1;j<=n;j++)
{
if(book[j]==0&&minn>dis[j])
{
minn=dis[j];
p=j;
}
}
book[p]=1;
for(j=0;j<edge1[p].size();j++)
{
t=edge1[p][j];
if(book[t.v]==0&&dis[t.v]>dis[p]+t.w)
{
dis[t.v]=dis[p]+t.w;
}
}
}
for(i=1;i<=n;i++)
{
sum1+=(long long)dis[i];
}
return;
}
void calculate2()
{
struct node t;
long long minn;
int i,j,p;
for(i=1;i<=n;i++)
{
dis[i]=N;
book[i]=0;
}
dis[1]=0;
for(i=0;i<edge2[1].size();i++)
{
t=edge2[1][i];
dis[t.v]=t.w;
}
book[1]=1;
for(i=1;i<=n-1;i++)
{
minn=N;
for(j=1;j<=n;j++)
{
if(book[j]==0&&minn>dis[j])
{
minn=dis[j];
p=j;
}
}
book[p]=1;
for(j=0;j<edge2[p].size();j++)
{
t=edge2[p][j];
if(book[t.v]==0&&dis[t.v]>dis[p]+t.w)
{
dis[t.v]=dis[p]+t.w;
}
}
}
for(i=1;i<=n;i++)
{
sum2+=(long long)dis[i];
}
return;
}