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

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

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

      CF715B. Complete The Graph

      CF715B. Complete The Graph

      題意:

      給一張 n 個點,m 條邊的無向圖,要求設定一些邊的邊權
      使得所有邊權都是正整數,最終 S 到 T 的最短路為 L

      1 ≤ n ≤ 1000, 1 ≤ m ≤ 10000


      假做法:

      spfa求s到t最短路且滿足可變邊最少

      然后把不在最短路上的可變邊標為inf,最短路上的可變邊修改成使最短路長為L

      假的原因:

      其他的賦值為inf只是保證了經過其他可變邊的路徑不會更短,沒有保證不經過其他可變邊只是少經過了幾條可變邊、導致比最短路長的路徑不會在最短路修改后更短

      存在繞過某條可變邊的路徑p,本來不是最短路且不經過最短路上可變邊x,但你修改x之后,p會變成當前最短路,于是這個做法就掛掉了。

      就是說走了非可變邊,把你修改的那條可變邊繞過去了

      修正:

      真做法1:

      應當選擇滿足d<L的路徑中經過可變邊最少的一條

      可以在最短路上加維,\(d(i,j)\)表示1到i經過j條可變邊的最短路

      復雜度\(O(mn\log{mn})\)

      真做法2:

      隨便求一條最短路,同樣其他賦值inf,然后枚舉最短路上的可變邊,依次修改改可變邊的值,修改后再求最短路看看會不會被繞過去。最后一定會收斂出答案

      無解:不經過可變邊就可以<L,經過可變邊也比L大

      #include <iostream>
      #include <cstdio>
      #include <algorithm>
      #include <cstring>
      #include <queue>
      #include <vector>
      using namespace std;
      typedef long long ll;
      const int N = 1e5+5, M = 1e6+5;
      const ll inf = 1e16;
      
      int n, m, L, s, t;
      struct edge {int u, v, ne; ll w;} e[M];
      struct meow {int u, v; ll w;} a[M];
      int cnt=1, h[N], mark[M];
      inline void ins(int u, int v, ll w) {
      	if(w == 0) w=1, mark[cnt+1] = mark[cnt+2] = 1;
      	e[++cnt] = (edge) {u, v, h[u], w}; h[u] = cnt;
      	e[++cnt] = (edge) {v, u, h[v], w}; h[v] = cnt;
      	a[cnt>>1] = (meow) {u, v, w};
      }
      inline void paint(int x, ll v) {
      	a[x].w = v;
      	e[x<<1].w = e[x<<1|1].w = v;
      }
      
      ll d[N];
      int inq[N], pre[N];
      int q[N], head, tail;
      inline void lop(int &x) {if(x==N) x = 1;}
      void spfa0(int s) {
      	memset(d, 0x3f, sizeof(d));
      	head = tail = 1;
      	d[s] = 0; q[tail++] = s;  inq[s] = 1;
      	while(head != tail) {
      		int u = q[head++]; lop(head); inq[u] = 0;
      		for(int i=h[u]; i; i=e[i].ne) if(!mark[i]) {
      			int v = e[i].v;
      			if(d[v] > d[u] + e[i].w) {
      				d[v] = d[u] + e[i].w;
      				if(!inq[v]) q[tail++] = v, lop(tail), inq[v] = 1;
      			}
      		}
      	}
      }
      
      void spfa(int s) {
      	memset(d, 0x3f, sizeof(d));
      	memset(inq, 0, sizeof(inq));
      	head = tail = 1;
      	d[s] = 0; q[tail++] = s;  inq[s] = 1;
      	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;
      				pre[v] = i;
      				if(!inq[v]) q[tail++] = v, lop(tail), inq[v] = 1;
      			}
      		}
      	}
      }
      int chose[N];
      vector<int> li;
      int main() {
      	//freopen("in", "r", stdin);
      	ios::sync_with_stdio(false); cin.tie(); cout.tie();
      	cin >> n >> m >> L >> s >> t;
      	s++; t++;
      	for(int i=1; i<=m; i++) {
      		int u, v, w;
      		cin >> u >> v >> w;
      		u++; v++;
      		ins(u, v, w);
      	}
      	spfa0(s);
      	if(d[t] < L) {cout << "NO"; return 0;}
      	spfa(s);
      	if(d[t] > L) {cout << "NO"; return 0;}
      	if(d[t] == L) {
      		cout << "YES" << endl;
      		for(int i=1; i <= cnt>>1; i++) cout << a[i].u-1 << ' ' << a[i].v-1 << ' ' << a[i].w << '\n';
      		return 0;
      	}
      	
      	
      	int x = t;
      	while(x != s) {
      		if(mark[pre[x]]) chose[pre[x]>>1] = 1, li.push_back(pre[x]>>1);
      		x = e[pre[x]].u;
      	}
      	for(int i=1; i<=cnt>>1; i++) if(mark[i<<1] && !chose[i]) paint(i, inf);
      	for(int i=0; i<li.size(); i++) {
      		int now = li[i];
      		int delta = L - d[t] + 1;
      		paint(now, delta);
      		spfa(s);
      		if(d[t] == L) break;
      	}
      	cout << "YES" << endl;
      	for(int i=1; i <= cnt>>1; i++) cout << a[i].u-1 << ' ' << a[i].v-1 << ' ' << a[i].w << '\n';
      }
      
      
      

      ps:假做法的代碼

      #include <iostream>
      #include <cstdio>
      #include <algorithm>
      #include <cstring>
      #include <queue>
      using namespace std;
      typedef long long ll;
      const int N = 1e5+5, M = 1e6+5;
      const ll inf = 1e16;
      
      int n, m, L, s, t;
      struct edge {int u, v, ne; ll w;} e[M];
      struct meow {int u, v; ll w;} a[M];
      int cnt=1, h[N], mark[M];
      inline void ins(int u, int v, ll w) {
      	if(w == 0) w=1, mark[cnt+1] = mark[cnt+2] = 1;
      	e[++cnt] = (edge) {u, v, h[u], w}; h[u] = cnt;
      	e[++cnt] = (edge) {v, u, h[v], w}; h[v] = cnt;
      	a[cnt>>1] = (meow) {u, v, w};
      }
      
      ll d[N];
      int inq[N], cou[N], pre[N];
      int q[N], head, tail;
      inline void lop(int &x) {if(x==N) x = 1;}
      void spfa0(int s) {
      	memset(d, 0x3f, sizeof(d));
      	head = tail = 1;
      	d[s] = 0; q[tail++] = s;  inq[s] = 1;
      	while(head != tail) {
      		int u = q[head++]; lop(head); inq[u] = 0;
      		for(int i=h[u]; i; i=e[i].ne) if(!mark[i]) {
      			int v = e[i].v;
      			if(d[v] > d[u] + e[i].w) {
      				d[v] = d[u] + e[i].w;
      				if(!inq[v]) q[tail++] = v, lop(tail), inq[v] = 1;
      			}
      		}
      	}
      }
      namespace test {
      	int pre[N];
      void spfa1(int s) {
      	memset(d, 0x3f, sizeof(d));
      	head = tail = 1;
      	d[s] = 0; q[tail++] = s;  inq[s] = 1;
      	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;
      				pre[v] = i;
      				if(!inq[v]) q[tail++] = v, lop(tail), inq[v] = 1;
      			}
      		}
      	}
      }
      }
      void spfa(int s) {
      	memset(d, 0x3f, sizeof(d));
      	memset(cou, 0x3f, sizeof(cou));
      	memset(inq, 0, sizeof(inq));
      	head = tail = 1;
      	d[s] = 0; cou[s] = 0; q[tail++] = s;  inq[s] = 1;
      	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] + mark[i])) {
      				d[v] = d[u] + e[i].w;
      				cou[v] = cou[u] + mark[i];
      				pre[v] = i;
      				if(!inq[v]) q[tail++] = v, lop(tail), inq[v] = 1;
      			}
      		}
      	}
      }
      int chose[N];
      int main() {
      	//freopen("in", "r", stdin);
      	ios::sync_with_stdio(false); cin.tie(); cout.tie();
      	cin >> n >> m >> L >> s >> t;
      	s++; t++;
      	for(int i=1; i<=m; i++) {
      		int u, v, w;
      		cin >> u >> v >> w;
      		u++; v++;
      		ins(u, v, w);
      	}
      	spfa0(s);
      	if(d[t] < L) {cout << "NO"; return 0;}
      	spfa(s);
      	if(d[t] > L) {cout << "NO"; return 0;}
      	if(d[t] == L) {
      		cout << "YES" << endl;
      		for(int i=1; i <= cnt>>1; i++) cout << a[i].u-1 << ' ' << a[i].v-1 << ' ' << a[i].w << '\n';
      		return 0;
      	}
      	
      	int x = t;
      	int flag = 0;
      	while(x != s) {
      		if(mark[pre[x]]) chose[pre[x]>>1] = 1, flag = pre[x] >> 1;
      		x = e[pre[x]].u;
      	}
      	if(!flag) {cout << "NO"; return 0;}
      	for(int i=1; i <= cnt>>1; i++) if(mark[i<<1] && !chose[i]) a[i].w = inf;
      	for(int i=1; i<=cnt; i++) if(mark[i] && !chose[i>>1]) e[i].w = inf;
      	int delta = L - d[t] + 1;
      	a[flag].w = delta; 
      	e[flag<<1].w = e[flag<<1|1].w = delta;
      
      
      	test::spfa1(s);
      	if(d[t] != L) {
      		cout << d[t] << "nooooo\n";
      		int x = t;
      		while(x != s) {
      			if(test::pre[x] != pre[x]) {
      				cout << "wrong\n";
      				cout << mark[pre[x]] << "   " << mark[test::pre[x]] << '\n';
      			}
      			x = e[pre[x]].u;
      		}
      	}
      	cout << "YES" << endl;
      	for(int i=1; i <= cnt>>1; i++) cout << a[i].u-1 << ' ' << a[i].v-1 << ' ' << a[i].w << '\n';
      }
      
      
      posted @ 2018-07-09 21:55  Candy?  閱讀(354)  評論(0)    收藏  舉報
      主站蜘蛛池模板: 亚洲色大成网站www永久男同| 91孕妇精品一区二区三区| 钟祥市| 亚洲国产性夜夜综合| 综合色一色综合久久网| 连南| 最新亚洲人成网站在线观看| 久久人人爽人人爽人人av | 口爆少妇在线视频免费观看| 久久日韩精品一区二区五区| 国产专区一va亚洲v天堂| 国产精品毛片在线完整版| 国产精品午夜福利视频| 亚洲一区二区三区 无码| 亚洲欧美综合人成在线| 人妻少妇456在线视频| 日韩av综合免费在线| 蜜桃av无码免费看永久| 久久先锋男人AV资源网站| 国内精品久久久久影院网站| 精品国产乱码久久久人妻| 好男人好资源WWW社区| 国产成人亚洲欧美二区综合| 亚洲天堂亚洲天堂亚洲天堂| 欧美性猛交xxxx乱大交丰满| 中文字幕国产在线精品| 国产欧美亚洲精品a第一页| 日日噜噜夜夜狠狠久久无码区| 国产免费性感美女被插视频| 国产精品天天狠天天看| 国产成人高清精品亚洲一区| 国产精品自在线拍国产手机版| 日韩有码中文字幕国产| 亚洲国产日韩一区三区| 欧美亚洲另类制服卡通动漫| 爆乳日韩尤物无码一区| 大悟县| 久久久久久综合网天天| 国产精品嫩草99av在线| 国产色无码专区在线观看| 少妇真人直播免费视频|