<output id="qn6qe"></output>

    1. <output id="qn6qe"><tt id="qn6qe"></tt></output>
    2. <strike id="qn6qe"></strike>

      亚洲 日本 欧洲 欧美 视频,日韩中文字幕有码av,一本一道av中文字幕无码,国产线播放免费人成视频播放,人妻少妇偷人无码视频,日夜啪啪一区二区三区,国产尤物精品自在拍视频首页,久热这里只有精品12

      關于最短路、負環、差分約束系統的一點筆記

      關于最短路、負環、差分約束系統的一點筆記

      最短路

      “可以”沒有環,最多\(|V|-1\)條邊

      有負環則不存在最短路

      會形成最短路徑樹

      算法

      1. Dijkstra 貪心,當\(d_u\)是最小時要滿足之后\(d_u\)不會更小,不能處理負權邊
      2. Bellman-Ford 迭代n-1輪,用邊松弛
      3. spfa 隊列優化的Bellman-Ford

      最短路的線性規劃形式

      最大化 \(d_i\)

      滿足

      1. 三角不等式 $d_v \le d_u + w(u,v),\ $
      2. \(d_s=0\)

      說明:上述約束對應了無窮組解。最短路求的是滿足約束的最大值。因為三角不等式要求取等號時w(u,v)是最短路上的邊。

      應用

      差分約束系統

      非DAG上DP

      一般使用spfa或者縮點后dp

      應為dijkstra有貪心策略的限制

      負環

      將所有點入隊,且\(d_i=0\)

      負環只看不等約束,不看初始值

      算法

      1. Bellman-Ford 常數小
      2. spfa 判斷 1. 入隊次數>=n 2.最短路長度>=n
      3. spfa-dfs 沒多大意思,輕松被卡

      應用

      01分數規劃

      代碼

      見最后

      差分約束系統

      和最短路的線性規劃形式類似的一類線性規劃問題

      也是需要初值的,對應d[s]=0

      最短路

      最大化

      有負環則無解

      圖不連通 無關 任意解

      最長路

      最小化

      有正環則無解

      圖不連通 無關 任意解

      當然也可以轉化成最短路


      附錄:

      判負環的代碼

      #include <iostream>
      #include <cstdio>
      #include <cstring>
      #include <algorithm>
      #include <queue>
      using namespace std;
      const int N = 2005, M = 3005;
      
      inline int read() {
      	int x = 0, f = 1; char c = getchar();
      	while(c<'0' || c>'9') {if(c=='-') f=-1; c=getchar();}
      	while(c>='0' && c<='9') {x=x*10+c-'0'; c=getchar();}
      	return x * f;
      }
      
      int n, m;
      struct edge {int v, ne, w, u;} e[M<<1];
      int cnt, h[N];
      inline void ins(int u, int v, int w) {
      	e[++cnt] = (edge) {v, h[u], w, u}; h[u] = cnt;
      }
      
      int d[N], cou[N];
      bool bellman_ford() {
      	for(int i=1; i<=n; i++) d[i] = cou[i] = 0;
      	for(int i=1; i<=n; i++) {
      		for(int i=1; i<=cnt; i++) {
      			int u = e[i].u, v = e[i].v; //printf("hi %d %d  %d %d\n", u, v, d[u], d[v]);
      			if(d[v] > d[u] + e[i].w) {
      				d[v] = d[u] + e[i].w;
      				cou[v] = cou[u] + 1;
      				if(cou[v] >= n) return false;
      				if(i == n) return false;
      			}
      		}
      	}
      	return true;
      }
      int main() {
      	freopen("in", "r", stdin);
      	int T = read();
      	while(T--) {
      		cnt = 0; memset(h, 0, sizeof(h));
      
      		n = read(); m = read();
      		for(int i=1; i<=m; i++) {
      			int u = read(), v = read(), w = read();
      			if(w < 0) ins(u, v, w);
      			else ins(u, v, w), ins(v, u, w);
      		}
      		puts(bellman_ford() ? "N0" : "YE5");
      	}
      }
      
      
      
      #include <iostream>
      #include <cstdio>
      #include <cstring>
      #include <algorithm>
      #include <queue>
      using namespace std;
      const int N = 2005, M = 3005;
      
      inline int read() {
      	int x = 0, f = 1; char c = getchar();
      	while(c<'0' || c>'9') {if(c=='-') f=-1; c=getchar();}
      	while(c>='0' && c<='9') {x=x*10+c-'0'; c=getchar();}
      	return x * f;
      }
      
      int n, m;
      struct edge {int v, ne, w;} e[M<<1];
      int cnt, h[N];
      inline void ins(int u, int v, int w) {
      	e[++cnt] = (edge) {v, h[u], w}; h[u] = cnt;
      }
      int d[N], cou[N], inq[N], cinq[N];
      int q[N], head, tail;
      inline void lop(int &x) {if(x==N) x=1;}
      bool spfa() {
      	head = tail = 1;
      	for(int i=1; i<=n; i++) d[i] = cou[i] = 0, inq[i] = cinq[i] = 1, q[tail++] = i;
      	while(head != tail) {
      		int u = q[head++]; lop(head); inq[u] = 0;
      		for(int i=h[u]; i; i=e[i].ne) {
      			int v = e[i].v;
      			if(d[v] > d[u] + e[i].w) {
      				d[v] = d[u] + e[i].w;
      				cou[v] = cou[u] + 1;
      				if(cou[v] >= n) return false;
      				if(!inq[v]) {
      					q[tail++] = v; lop(tail); inq[v] = 1; 
      					if(++cinq[v] >= n) return false; 
      				}
      			}
      		}
      	}
      	return true;
      }
      
      int main() {
      	freopen("in", "r", stdin);
      	int T = read();
      	while(T--) {
      		cnt = 0; memset(h, 0, sizeof(h));
      
      		n = read(); m = read();
      		for(int i=1; i<=m; i++) {
      			int u = read(), v = read(), w = read();
      			if(w < 0) ins(u, v, w);
      			else ins(u, v, w), ins(v, u, w);
      		}
      		puts(spfa() ? "N0" : "YE5");
      	}
      }
      
      
      posted @ 2018-07-09 08:56  Candy?  閱讀(649)  評論(0)    收藏  舉報
      主站蜘蛛池模板: 99精品国产中文字幕| 婷婷综合缴情亚洲| 天天澡日日澡狠狠欧美老妇| 奇米777四色影视在线看| 亚洲精品亚洲人成人网| 国产精品区一二三四久久| 亚洲人成精品久久久久| 国产精品午夜福利精品| 精品久久精品午夜精品久久| 国产精品高潮无码毛片| 肉大捧一进一出免费视频| 国产AV无码专区亚洲AWWW| 国产高潮刺激叫喊视频| 99国产欧美另类久久久精品| 精品无码国产污污污免费| 隔壁老王国产在线精品| 国产精品天干天干综合网| 蜜臀98精品国产免费观看| 高清国产美女一级a毛片在线| 中文文字幕文字幕亚洲色| 国产亚洲精品久久久久久久软件| 青青青青国产免费线在线观看| 苍井空毛片精品久久久| 亚洲人成亚洲人成在线观看| 亚洲色欲色欱WWW在线| 2021亚洲爆乳无码专区| 国产激情一区二区三区在线| 欧美韩中文精品有码视频在线| 日韩有码国产精品一区| 日本精品aⅴ一区二区三区| 暖暖 在线 日本 免费 中文| av色蜜桃一区二区三区| 自拍偷自拍亚洲精品熟妇人| 久久久久人妻精品一区三寸 | 国产欧美精品一区aⅴ影院| 精品少妇人妻av无码专区| 老色批国产在线观看精品| 久久狠狠高潮亚洲精品| 久久精品国产一区二区三| 九九热精品免费在线视频| 久久久精品午夜免费不卡|