本篇文章,参考了y990041769同学的blog,他的博客地址如下[http://blog.csdn.net/y990041769/article/details/18367665]
受他启发,这道题实际上从1出发到某个点,以及从此点回到1的最短距离。其实感觉只要建图,跑一遍spfa之后,再逆序跑一遍spfa就好了,可是在建图的时候坑死一大片,建图的时候用vector是会t的,虽然本题给了8s(Orz!)
参考邻接表的模板,写了一个能过的版本,现在分享出来。
先上模板:
int H[N];
struct
{
int v;
int count;
int next;
}E[N];
int T,n,m,top;
void Readmap(int m)
{
memset(H,-1,sizeof(H));
int top=0;
for(int i=0;i<m;i++){
scanf("%d%d%d",&x[i],&y[i],&c[i]);
E[top].v=y[i];E[top].count=c[i];
E[top].next=H[x[i]];
H[x[i]]=top++;
}
}
long long SPFA(int st)
{
for(int i=1;i<=n;i++)
sp[i]=inf;
sp[1]=0;
queue<int> q;
q.push(st);
while(!q.empty())
{
int kai=q.front();q.pop();
for(int i=H[kai];i!=-1;i=E[i].next)
{
if(sp[E[i].v]>E[i].count+sp[kai]){
sp[E[i].v]=E[i].count+sp[kai];
q.push(E[i].v);
}
}
}
long long ans=0;
for(int i=1;i<=n;i++)
ans+=sp[i];
return ans;
}
#include<cstdio>
#include<cstring>
#include<cstdlib>
#include<algorithm>
#include<stack>
#include<queue>
#include<cmath>
#include<iostream>
using namespace std;
#define maxn 1000005
#define INF 0x3f3f3f3f
typedef long long LL;
int x[maxn],y[maxn],c[maxn],sp[maxn];
int head[maxn];
struct node{
int v;
int cnt;
int next;
};
struct node E[maxn];
int n,m;
void input1()
{
int top=0;
for(int i=1;i<=m;i++)
{
scanf("%d%d%d",&x[i],&y[i],&c[i]);
E[top].v=y[i];
E[top].cnt=c[i];
E[top].next=head[x[i]];
head[x[i]]=top++;
}
}
void input2()
{
int top=0;
for(int i=1;i<=m;i++)
{
E[top].v=x[i];
E[top].cnt=c[i];
E[top].next=head[y[i]];
head[y[i]]=top++;
}
}
LL spfa(int st)
{
int j;
for(int i=1;i<=n;i++)
sp[i]=INF;
sp[1]=0;
queue<int>qq;
qq.push(st);
while(!qq.empty())
{
j=qq.front();
qq.pop();
for(int i=head[j];i!=-1;i=E[i].next)
{
if(sp[E[i].v]>E[i].cnt+sp[j])
{
sp[E[i].v]=E[i].cnt+sp[j];
qq.push(E[i].v);
}
}
}
LL ans=0;
for(int i=1;i<=n;i++)
ans+=sp[i];
return ans;
}
int main()
{
int tt;
scanf("%d",&tt);
while(tt--)
{
LL ans=0;
int u=1;
scanf("%d%d",&n,&m);
memset(E,INF,sizeof(INF));
memset(head,-1,sizeof(head));
input1();
ans+=spfa(u);
memset(E,INF,sizeof(E));
memset(head,-1,sizeof(head));
input2();
ans+=spfa(u);
printf("%lld\n",ans);
}
return 0;
}