题意:不好理解,看的网上的意思。大体意思就是,在有向图中,求1点到其它点最短路,和其他点到1点最短路的和。
思路:正向和反向建图,分别SPFA(1),最后求d[i]的和即可要注意 inf要足够大,同时累加和的时候int型的数据可能会越界,要用__int64.
#include<iostream>
#include<queue>
#define inf 0x7fffffff
using namespace std;
struct node
{
int u;
int c;
int next;
}e[1000100],f[1000100];
bool vis[1000100];
int d[1000100],p[1000100],p2[1000100];
void spfa(node e[],int p[],int s)
{
queue<int> q;
d[s]=0;
q.push(s);
while(!q.empty())
{
int t=q.front();
q.pop();
vis[t]=0;
for(int j=p[t];j!=-1;j=e[j].next)
{
int w=e[j].c;
int temp=e[j].u;
if(w+d[t]<d[temp])
{
d[temp]=w+d[t];
if(!vis[temp])
{
vis[temp]=1;
q.push(temp);
}
}
}
}
return;
}
int main()
{
int T;
int n,m;
int a,b,c;
scanf("%d",&T);
while(T--)
{
scanf("%d%d",&n,&m);
int temp=0,tem=0;
memset(p,-1,sizeof(p));
memset(p2,-1,sizeof(p2));
memset(vis,0,sizeof(vis));
fill(d,d+n+1,inf);
while(m--)
{
scanf("%d%d%d",&a,&b,&c);
e[temp].u=b;
e[temp].c=c;
e[temp].next=p[a];
p[a]=temp;
temp++;
f[tem].u=a;
f[tem].c=c;
f[tem].next=p2[b];
p2[b]=tem;
tem++;
}
__int64 sum=0;
spfa(e,p,1);
for(int i=2;i<=n;i++)
{
// printf("%d\n",d[i]);
sum+=d[i];
}
//printf("%d\n",sum);
//system("pause");
fill(d,d+n+1,inf);
spfa(f,p2,1);
for(int i=2;i<=n;i++)
{
//printf("%d\n",d[i]);
sum+=d[i];
}
printf("%I64d\n",sum);
}
}