spfa 差分約束

來源:互聯網
上載者:User

spfa 差分約束

 

/* spfa 差分約束<br />首先構造約束圖,構造不等式時>=表示求最小值, 作為最長路,<=表示求最大值, 作為最短路 (v-u <= c:a[u][v] = c)<br />用addedge加如所有的邊<br />返回0表示無解,返回1表示有可行解,可行解存在 dis 數組裡 */<br />bool vis[N];<br />int cnt[N],dis[N],head[N];<br />int V[E], next[E];<br />int W[E];<br />int ne, n, m;<br />void addedge(int u, int v, double w) {<br /> V[ne] = v;<br /> W[ne] = w;<br /> next[ne] = head[u];<br /> head[u] = ne++;<br />}<br />bool spfa(int s) {<br /> int i;<br /> queue<int>q;<br /> for (i = 0; i < n; i++) {<br /> vis[i] = false;<br /> dis[i] = inf;<br /> cnt[i] = 0;<br /> }<br /> q.push(s); /*這裡初始化要注意,直接 push 的點可能不止是起點*/<br /> vis[s]=true;<br /> dis[0] = 0;<br /> while (!q.empty()) {<br /> int u = q.front();<br /> q.pop();<br /> vis[u] = 0;<br /> for (int e = head[u]; e != -1; e = next[e]) {<br /> if (dis[u] + W[e] < dis[V[e]]) {<br /> dis[V[e]] = dis[u] + W[e];<br /> if (!vis[V[e]]) {<br /> q.push(V[e]);<br /> vis[V[e]] = 1;<br /> if (++cnt[V[e]] > n) /* 負環的判斷 */<br /> return 0;<br /> }<br /> }<br /> }<br /> }<br /> return 1;<br />}

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.