poj1511解题报告(SPFA算法)

题目大意:给出n个点和n条有向边,求所有点到源点1的来回最短路之和(保证每个点都可以往返源点1)

解题思路:使用spfa+邻接链表来做,因为要求来回的最短距离之和,所以先用spfa求一遍最短路,再把每条边反过来(a到b的边变成b到a的边)再用spfa求一遍最短路。

注意:结果要用long long 来储存

#include
#include
#include
#include
#include
using namespace std;
const int maxN=1000000+1000;
const int  INF=(1<<30);

int head[2][maxN],T,vis[maxN],n,m;
long long d[maxN];
struct Edge
{
    int e,next,w;
} edge[2][maxN];

void spfa(int cap){
    int v,i,b;
    queue q;
    for(i=1;i<=n;i++){
        d[i]=INF;
        vis[i]=0;
    }
    q.push(1);
    vis[1]=1;
    d[1]=0;//1为起始点
    while(!q.empty()){
        v=q.front();
        q.pop();
        vis[v]=0;
        for(i=head[cap][v];i!=-1;i=edge[cap][i].next){
            b=edge[cap][i].e;
            if(d[b]>d[v]+edge[cap][i].w){
                d[b]=d[v]+edge[cap][i].w;
                if(!vis[b]){
                    vis[b]=1;
                    q.push(b);
                }
            }
        }
    }
}

int main()
{
    scanf("%d",&T);
    while(T--)
    {
        scanf("%d%d",&n,&m);

        for(int i=1; i<=n; i++)
        {
                head[0][i]=-1;
                head[1][i]=-1;
        }
             for(int i=0;i


你可能感兴趣的:(最短路径)