日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 编程资源 > 编程问答 >内容正文

编程问答

UVA 11478 Halum (差分约束)

發布時間:2025/4/14 编程问答 20 豆豆
生活随笔 收集整理的這篇文章主要介紹了 UVA 11478 Halum (差分约束) 小編覺得挺不錯的,現在分享給大家,幫大家做個參考.

題目鏈接:https://uva.onlinejudge.org/index.php?option=com_onlinejudge&Itemid=8&page=show_problem&problem=2473

?

題解:

?首先我們可以得到的約束條件形如 xi - xj <= b[k] ,即可以轉換為 j - > i連邊,且權值為b[k],這樣建圖后我們判斷是否有解,只需要用spfa跑負圈就可以了.

?如果存在負圈,原差分系統定然無解.

?簡單證明:

?我們不妨設這個環為 x1,x2...xn

?即有不等式 x1 <= x2 + y1 , x2 <= x3 + y2 ..... xn <= x 1 + yn

?全部累加得 0 <= sigma (y)

?所以有解必須滿足sigma(y) >= 0 ,如果存在負圈,肯定是無解的.

?那么對于原圖,如何判斷infinate的情況呢?

?注意到約束條件必須是環,所以我們只需要檢測一下圖中是否有環就可以了.

?

#include <iostream> #include <cstdio> #include <cstring> #include <algorithm> #include <vector> #include <queue> using namespace std; const int maxn = 5e2 + 50; const double eps = 1e-6; struct Edge{int v , nxt , w;}; Edge e[maxn * 6]; int n , m , head[maxn] , tot , cnt[maxn] ,inq[maxn] ,d[maxn],c[maxn]; queue<int>q; void addedge(int u,int v,int w){e[tot].v=v,e[tot].nxt=head[u],e[tot].w=w,head[u]=tot++;}void edge_init(int x) {for(int i = 0 ; i < tot ; ++ i) e[i].w += x; }bool check() {while(!q.empty()) q.pop();memset(cnt , 0 , 4 * (n + 1));memset( d , 0 , 4 * (n + 1) );for(int i = 1 ; i <= n ; ++ i){inq[i] = 1;q.push(i);}while(!q.empty()){int x = q.front();q.pop();inq[x]=0;for(int i = head[x] ; ~i ; i = e[i].nxt){int v = e[i].v;double neww = d[x] + e[i].w;if(neww < d[v]){d[v] = neww;if(!inq[v]){inq[v] = 1;if(++cnt[v] > n) return true;q.push(v);}}}}return false; }bool dfs(int u) {c[u]=-1;for(int i = head[u] ; ~i ; i = e[i].nxt){int v = e[i].v;if(c[v]==1) continue;if(c[v]==-1) return true;if(dfs(v)) return true;}c[u]=1;return false; }int main(int argc,char *argv[]) {while(~scanf("%d%d",&n,&m)){memset(head,-1,4*(n+1));tot=0;memset(c , 0 , 4 * (n + 1));for(int i = 0 ; i < m ; ++ i){int u ,v,w ;scanf("%d%d%d",&u,&v,&w);addedge( u , v, w);}int flag = 0;for(int i = 1 ; i <= n ; ++ i)if(c[i]==0)if(dfs(i)){flag=1;break;}if(!flag){printf("Infinite\n");continue;}int L = 0 , R = 20000;while(L < R){int mid = L + (R-L+1)/2;edge_init(-mid);if(check()) R = mid-1;else L = mid;edge_init(mid);}edge_init(-L);if(L == 0 || check()) printf("No Solution\n");else printf("%d\n",L);}return 0; }

?

轉載于:https://www.cnblogs.com/Xiper/p/4900381.html

總結

以上是生活随笔為你收集整理的UVA 11478 Halum (差分约束)的全部內容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。