Spfa模板

来源:互联网 发布:淘宝网的地位和特点 编辑:程序博客网 时间:2024/06/13 00:10
#include<iostream>#include<cstring>#include<queue>using namespace std;const int MAXN=100002,MAXM=2000005,INF=0x7fffffff,Qsize=MAXN;int N,M,S,T;struct Edge  //使用数组模拟邻接表存储边信息{    int u,v,c;}E[MAXM];int fir[MAXN],next[MAXM],tot = 0;int dist[MAXN];queue<int>q;int cnt[MAXN];bool f[MAXN];void Add_Edge(int u,int v,int c){    E[tot].u=u;E[tot].v=v;E[tot].c=c;    next[tot]=fir[u],fir[v]=tot++;}void init(){    cin>>N>>M>>S>>T;    memset(fir, -1, sizeof(fir));    for(int i=1;i<=M;i++)    {        int u,v,c;        cin>>u>>v>>c;        Add_Edge(u,v,c);        Add_Edge(u,v,c);           //如果为有向图则不加此句    }}bool spfa(){    for(int i=1;i<=N;i++)    //初始化距离        dist[i]=INF;    dist[S]=0;    q.push(S);f[S]=0;    while(q.size())    {        int u=q.front(),v;        //取出队首元素        q.pop();        for(int i=fir[u]; ~i; i=next[i])    //枚举其每条出边进行松弛        {            v=E[i].v;            if(dist[u]+E[i].c < dist[v])            {                dist[v]=dist[u]+E[i].c;                if(f[v] == 0)                {                    f[v]=1;                    q.push(v);                }                cnt[v]++;         //记录每个点入队次数                if(cnt[v]>N)                    return false;   //如果某个点入队超过N次,则有负环            }        }        f[u]=0;    }    return true;}int main(){    init();    if(spfa())        cout<<dist[T]<<endl;    else        cout<<"-INF"<<endl;    return 0;}

原创粉丝点击