题目:http://poj.org/problem?id=1511
分析:spfa,再把边反向spfa
代码:
#include <cstdio>
#include <algorithm>
#include <cstring>
#include <vector>
#include <queue>
using namespace std;
const int Tmax=1000005,inf=2147483647;
struct edge{
int u,v;
long long int w;
};
edge E[Tmax];
vector<int> G[Tmax];
queue<int> Q;
int n,m;
long long int dist[Tmax],ans;
bool v[Tmax];
void spfa()
{
while(!Q.empty()) Q.pop();
Q.push(1);
dist[1]=0;
v[1]=true;
int x,i,len,to;
while(!Q.empty())
{
x=Q.front();
Q.pop();
v[x]=false;
len=G[x].size();
for(i=0;i<len;i++)
{
to=E[G[x][i]].v;
if(dist[x]+E[G[x][i]].w<dist[to])
{
dist[to]=dist[x]+E[G[x][i]].w;
if(v[to]==false){
Q.push(to);
v[to]=true;
}
}
}
}
return;
}
int main()
{
int T,i;
scanf("%d",&T);
while(T--)
{
ans=0;
scanf("%d%d",&n,&m);
for(i=1;i<=n;i++)
dist[i]=inf;
for(i=1;i<=n;i++)
G[i].clear();
for(i=1;i<=m;i++)
{
scanf("%d%d%lld",&E[i].u,&E[i].v,&E[i].w);
G[E[i].u].push_back(i);
}
memset(v,0,sizeof(v));
spfa();
for(i=1;i<=n;i++)
{
G[i].clear();
ans+=dist[i];
}
for(i=1;i<=m;i++)
{
G[E[i].v].push_back(i);
swap(E[i].u,E[i].v);
}
memset(v,0,sizeof(v));
for(i=1;i<=n;i++)
dist[i]=inf;
spfa();
for(i=1;i<=n;i++)
ans+=dist[i];
printf("%lld\n",ans);
}
return 0;
}