题目分析:
正建图,统计,反建图,统计。
没了。
#include <queue>
#include <iostream>
#include <cstdio>
#include <cstring>
#define il inline
#define cnt Cnt[f]
using namespace std;
const int maxm=1100000;
int inf;
int head[2][maxm],to[2][maxm*2],net[2][maxm*2],cost[2][maxm*2],Cnt[2];
int n,m,k;
int dis[maxm];
bool vis[maxm];
il void add_edge(int s,int t,int c,int f)
{
cnt++;
to[f][cnt]=t,cost[f][cnt]=c;
net[f][cnt]=head[f][s],head[f][s]=cnt;
}
queue <int> dl;
void SPFA(int f)
{
memset(dis,127,sizeof(dis));
dis[1]=0,vis[1]=1;
dl.push(1);
while(!dl.empty())
{
int x=dl.front();
dl.pop();
vis[x]=0;
for(int i=head[f][x];i;i=net[f][i])
if(dis[to[f][i]]>dis[x]+cost[f][i])
{
dis[to[f][i]]=dis[x]+cost[f][i];
if(!vis[to[f][i]]) vis[to[f][i]]=1,dl.push(to[f][i]);
}
}
}
int main()
{
scanf("%d%d",&n,&m);
for(int i=1;i<=m;i++)
{
int u,v,c;
scanf("%d%d%d",&u,&v,&c);
add_edge(v,u,c,1),add_edge(u,v,c,0);
}
long long ans=0;
SPFA(0);
for(int i=2;i<=n;i++) ans+=(long long)dis[i];
SPFA(1);
for(int i=2;i<=n;i++) ans+=(long long)dis[i];
return printf("%lld",ans)*0;
}