SPFA

如果不new node,即使改了里面的值,地址任然相同。

#include<iostream>
#include<cstdio>
#include<algorithm>
#include<queue>
using namespace std;
struct node
{
    int to;
    int weight;
    node* next;
};
queue<int> q;
const int N=105;
const int INF=1<<30;
node* list[N];
int n;
int dist[N],path[N];
int vis[N];
void SPFA(int src)
{
    int u,v;
    q.push(src);
    memset(vis,0,sizeof(vis));
    vis[src]++;
    fill(dist,dist+N,INF);
    dist[0]=0;
    memset(path,NULL,sizeof(path));
    while(!q.empty())
    {
        u=q.front(); q.pop();
        vis[u]--;
        node* temp=list[u];
        while(temp!=NULL)
        {
            v=temp->to;
            if(temp->weight+dist[u]<dist[v])
            {
                dist[v]=temp->weight+dist[u];
                path[v]=u;
                if(!vis[v])
                {
                    q.push(v);
                    vis[v]++;
                }
            }
            temp=temp->next;
        }
    }
}
int main()
{
    freopen("in.txt","r",stdin);
    cin>>n;
    int u,v,w;
    memset(list,0,sizeof(list));
    node* temp;
    while(1)
    {
        cin>>u>>v>>w;
        if(u==-1&&v==-1&&w==-1)
            break;
        temp=new node;
        temp->to=v;
        temp->weight=w;
        temp->next=NULL;
        if(list[u]==NULL) list[u]=temp;
        else
        {
            temp->next=list[u];
            list[u]=temp;
        }
    }
    SPFA(0);
    for(int i=0;i<n;i++)
    {
        temp=list[i];
        while(temp!=NULL)
        {
            list[i]=temp->next;
            delete temp;
            temp=list[i];
        }
    }
    int past[N];
    int tmp=0;
    for(int i=1;i<n;i++)
    {
        cout<<dist[i]<<":"<<endl;
        tmp=0;
        int ans=i;
        past[tmp]=path[ans];
        while(past[tmp++]!=0)
        {
            ans=path[ans];
            past[tmp]=path[ans];
        }
        for(int j=tmp-1;j>=0;j--)
        {
            cout<<past[j]<<"->";
        }
        cout<<i;
        cout<<endl;
    }
    return 0;
}

你可能感兴趣的:(SPFA)