本题的题意是要求出从起点到各个点的所有最小权值和,并且要反过来再求一遍,本题用spfa来做,本来想用bellman_ford来做的,但试了一下超时了,故给出spfa,但我还是在后面贴出超时的代码,也许哪位大佬可以帮我看看;另外感觉自己写代码越来越模式化了。。做后面的题目我觉得关键是读懂题意和如何建图的问题了;
spfa:
#include<cstdio>
#include<queue>
#include<stack>
#include<cstring>
#include<iostream>
using namespace std;
typedef long long ll;
const int maxn=1e6+10;
const int N=6000;
const int INF=1e9+10;
ll dis[maxn];
int vis[maxn],head[maxn],len,n;
ll sum;
struct node
{
int u,v,c,next;
}p[maxn];
void add(int a,int b,int c)
{
p[len].u=a;
p[len].v=b;
p[len].c=c;
p[len].next=head[a];
head[a]=len++;
}
void spfa(int x)
{
stack<int> q;
q.push(x);
dis[x]=0;
vis[x]=1;
while(!q.empty())
{
int u=q.top();
q.pop();
vis[u]=0;
for(int i=head[u];i!=-1;i=p[i].next)
{
int v=p[i].v;
if(dis[v]>dis[u]+p[i].c)
{
dis[v]=dis[u]+p[i].c;
if(vis[v]) continue;
vis[v]=1;
q.push(v);
}
}
}
for(int i=1;i<=n;i++)
if(dis[i]!=INF)
sum+=dis[i];
}
void init()
{
len=0;
for(int i=1;i<=n;++i)
{
dis[i]=INF;
vis[i]=0;
}
memset(head,-1,sizeof(head));
}
int main()
{
int m,w,a,b,c,i,t;
//freopen("J.txt","r",stdin);
scanf("%d",&t);
while(t--)
{
scanf("%d%d",&n,&m);
init();sum=0;
for(int i=0;i<m;i++)
{
scanf("%d%d%d",&a,&b,&c);
add(a,b,c);
}
spfa(1);
init();
for(int i=0;i<m;i++)
{
a=p[i].u,b=p[i].v,c=p[i].c;
add(b,a,c);
}
spfa(1);
printf("%lld\n",sum);
}
return 0;
}
bellman_ford:
#include<cstdio>
#include<queue>
#include<stack>
#include<cstring>
#include<iostream>
using namespace std;
typedef long long ll;
const int maxn=1e6+10;
const int N=6000;
const int INF=1e9+10;
ll dis[maxn];
int vis[maxn],head[maxn],len,n;
ll sum;
struct node
{
int u,v,c,next;
}p[maxn];
void add(int a,int b,double c)
{
p[len].u=a;
p[len].v=b;
p[len++].c=c;
}
void bellman_ford(int x)
{
dis[x]=0;
for(int i=1;i<n;i++)
{
for(int j=0;j<len;j++)
{
//cout<<"here"<<endl;
int u=p[j].u,v=p[j].v;
int c=p[j].c;
if(dis[u]>dis[v]+c)
{
dis[u]=dis[v]+c;
//cout<<dis[u]<<endl;
}
}
}
for(int i=1;i<=n;i++)
if(dis[i]!=INF)
sum+=dis[i];
}
void init()
{
len=0;
for(int i=1;i<=n;++i)
{
dis[i]=INF;
vis[i]=0;
}
memset(head,-1,sizeof(head));
}
int main()
{
int m,w,a,b,c,i,t;
//freopen("J.txt","r",stdin);
scanf("%d",&t);
while(t--)
{
scanf("%d%d",&n,&m);
init();sum=0;
for(int i=0;i<m;i++)
{
scanf("%d%d%d",&a,&b,&c);
add(a,b,c);
}
bellman_ford(1);
init();
for(int i=0;i<m;i++)
{
a=p[i].u,b=p[i].v,c=p[i].c;
add(b,a,c);
}
bellman_ford(1);
printf("%lld\n",sum);
}
return 0;
}