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 />}