题目大意:
有向图。。
点1到除点1外所有点的环的权值和。
正着spfa反着spfa。。
贴代码
#include<cstdio>
#include<algorithm>
#include<cstring>
using namespace std;
int i,j,k,t,x,z,y,tot,h[1000001],p[1000001];
long long sum,diss[1000001],dis[1000001],que[1000001];
bool f[1000001];
struct fj{
int next,tail,dis;
};
fj a[1000001],b[1000001];
int main()
{
scanf("%d",&t);
for (i=1;i<=t;i++)
{
memset(h,0,sizeof(h));
memset(p,0,sizeof(p));
tot=0;
int n,m;
scanf("%d%d",&n,&m);
for (j=1;j<=m;j++)
{
scanf("%d%d%d",&x,&y,&z);
tot++;
a[tot].next=h[x];
a[tot].dis=z;
a[tot].tail=y;
h[x]=tot;
b[tot].next=p[y];
b[tot].dis=z;
b[tot].tail=x;
p[y]=tot;
}
memset(dis,0x7f,sizeof(dis));
memset(f,false,sizeof(f));
dis[1]=0;que[1]=1;f[1]=true;
int head=0,tail=1;
while (head<tail)
{
head++;
int c=que[head];
f[c]=false;
for (j=h[c];j;j=a[j].next)
if (dis[a[j].tail]>dis[c]+a[j].dis){
dis[a[j].tail]=dis[c]+a[j].dis;
if (!f[a[j].tail]){
tail++;
que[tail]=a[j].tail;
f[a[j].tail]=true;
}
}
}
memset(diss,0x7f,sizeof(diss));
memset(f,false,sizeof(f));
diss[1]=0;que[1]=1;f[1]=true;
head=0;tail=1;
while (head<tail)
{
head++;
int c=que[head];
f[c]=false;
for (j=p[c];j;j=b[j].next)
if (diss[b[j].tail]>diss[c]+b[j].dis){
diss[b[j].tail]=diss[c]+b[j].dis;
if (!f[b[j].tail]){
tail++;
que[tail]=b[j].tail;
f[b[j].tail]=true;
}
}
}
sum=0;
for (j=2;j<=n;j++)
sum=sum+dis[j]+diss[j];
printf("%lld\n",sum);
}
}