1. 程式人生 > >最短路(判負環

最短路(判負環

map event inf click sizeof show bool nbsp 存在

技術分享圖片
void Add(int u,double cost,int v)//鄰接表存儲關系
{
    w[top] = cost;
    Key[top] = v;
    next[top] = head[u];
    head[u] = top++;
}
 
bool SPFA(int x)
{
 
    memset(vis,false,sizeof(vis));
    memset(inq,0,sizeof(inq));
    queue<int> Q;
    for(int i = 1;i <= n;i++) dis[i] = (i == x ? 0
: INF); vis[x] = true; inq[x] = 1; Q.push(x); while(!Q.empty()) { int cur = Q.front(); Q.pop(); vis[cur] = false; for(int e = head[cur] ; e != -1; e = next[e]) { int v = Key[e]; if(dis[v] < dis[cur] * w[e]) { dis[v]
= dis[cur] * w[e]; if(!vis[v]) { inq[v] ++; if(inq[v] >= n) return true;//如果入隊次數超過n-1次說明存在環或負權 Q.push(v); vis[v] = true; } } } } return
false; }
View Code

初始map為INF

技術分享圖片
bool SPFA(int x)
{
    queue<int> Q;
    memset(vis,false,sizeof(vis));
    memset(in,false,sizeof(in));
    for(int i = 1;i <= n;i++)   dis[i] = (i==x?0: INF);
    vis[x] = true;
    Q.push(x);
    in[x] = 1;
    while(!Q.empty())
    {
        int cur = Q.front();
        Q.pop();
        vis[cur] = false;
        for(int i = 1;i <=n;i++)
        {
            if(map[cur][i]!=-INF&&dis[i] < dis[cur] * map[cur][i])
            {
                dis[i] = dis[cur] * map[cur][i];
                if(!vis[i])
                {
                    in[i] ++;
                    if(in[i] >= n) return true;//如果入隊次數超過n-1次說明存在環或負權
                    Q.push(i);
                    vis[i] = true;
                }
            }
        }
    }
    return false;
}                                                                                                                                                         
View Code

最短路(判負環