poj 1511 spfa

题意:不好理解,看的网上的意思。大体意思就是,在有向图中,求1点到其它点最短路,和其他点到1点最短路的和。

思路:正向和反向建图,分别SPFA(1),最后求d[i]的和即可要注意 inf要足够大,同时累加和的时候int型的数据可能会越界,要用__int64.

#include<iostream>
#include<queue>
#define inf 0x7fffffff
using namespace std;
struct node
{
  int u;
  int c;
  int next;
}e[1000100],f[1000100];
bool vis[1000100];
int d[1000100],p[1000100],p2[1000100];
void spfa(node e[],int p[],int s)
{
  queue<int> q;
  d[s]=0;
  q.push(s);
  while(!q.empty())
  {
    int t=q.front();
    q.pop();
    vis[t]=0;
    for(int j=p[t];j!=-1;j=e[j].next)
    {
      int w=e[j].c;
      int temp=e[j].u;
      if(w+d[t]<d[temp])
      {
        d[temp]=w+d[t];
        if(!vis[temp])
        {
          vis[temp]=1;
          q.push(temp);
        }
      }
    }
  }
  return;
}
int main()
{
  int T;
  int n,m;
  int a,b,c;
  scanf("%d",&T);
  while(T--)
  {
    scanf("%d%d",&n,&m);
    int temp=0,tem=0;
    memset(p,-1,sizeof(p));
    memset(p2,-1,sizeof(p2));
    memset(vis,0,sizeof(vis));
    fill(d,d+n+1,inf);
    while(m--)
    {
      scanf("%d%d%d",&a,&b,&c);
      e[temp].u=b;
      e[temp].c=c;
      e[temp].next=p[a];
      p[a]=temp;
      temp++;
      f[tem].u=a;
      f[tem].c=c;
      f[tem].next=p2[b];
      p2[b]=tem;
      tem++;
    }
    __int64 sum=0;
    spfa(e,p,1);
    for(int i=2;i<=n;i++)
    {
   // printf("%d\n",d[i]);
    sum+=d[i];
    }
    //printf("%d\n",sum);
    //system("pause");
    fill(d,d+n+1,inf);
    spfa(f,p2,1);
    for(int i=2;i<=n;i++)
    {
      //printf("%d\n",d[i]);
      sum+=d[i];
    }
    printf("%I64d\n",sum);
  }
}


评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值