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

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

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

      【數(shù)據(jù)結(jié)構(gòu)機試】圖

      存儲 & 訪問

      struct node{
        int to, d;
      };
      vector<node> e[N];
      
      for(auto x : e[u]) {
        ...
      }
      

      歐拉圖、哈密爾頓圖判定

      http://www.rzrgm.cn/re0acm/p/17521363.html

      例1
      https://www.luogu.com.cn/problem/P2731

      要在判斷歐拉圖的同時找出一種遍歷所有邊的方式。

      注意:必須先遍歷完子圖,再把當(dāng)前的邊加入,然后逆序輸出。

      點擊查看代碼
      #include<bits/stdc++.h>
      #define ull unsigned long long
      #define ll long long
      using namespace std;
      const int N = 500 + 10;
      int m, n = 500, u, v;
      int rd[N], path[N][N];
      int start = 1;
      int cnt, ans[N];
      
      void dfs(int u) {
          for(int i = 1; i <= 500; i++) {
              if(path[u][i]) {
                  path[u][i]--;
                  path[i][u]--;  //  有向圖刪掉
                  dfs(i);
              }
          }
          ans[++cnt] = u;
      }
      
      int main() {  
          ios::sync_with_stdio(false);
          cin >> m;
          for(int i = 1; i <= m; i++) {
              cin >> u >> v;
              path[u][v]++; path[v][u]++;
              rd[u]++; rd[v]++;
          }
          for(int i = 1; i <= 500; i++) {
              if(rd[i] % 2) {
                  start = i;
                  break;
              }
          }
          dfs(start);
          for(int i = cnt; i >= 1; i--) cout << ans[i] << endl;
          return 0;
      }
      
      
      

      拓撲排序

      每次找到一個入度為0的點,去掉從它出發(fā)的弧,遞歸處理。

      最短路

      dijk、floyd

      問題分類:

      • 求最短路
      • 求最短路條數(shù)
      • 輸出最短路徑
      • 在求最短路的同時要求其他條件

      放個模板:

      #include<bits/stdc++.h>  //dijkstra 模板 
      #define ll long long
      const int N = 100005,M = 200005,inf = 0x3f3f3f3f, mod = 1e9 + 7;
      using namespace std;
      int n,m,s;
      bool ok[N];
      int head[M],cnt;
      ll dis[N], Cnt[N];
      struct edge{
      	int v,next,to;
      };
      edge e[M];  //邊的數(shù)量 
      struct node{
      	ll dis;
      	int pos;
      	bool operator < (const node &x) const{
      		return x.dis<dis;
      	}
      };
      priority_queue<node>pq;
      
      void init(){
      	cnt=0;
      	memset(ok,0,sizeof(ok));
      	memset(head,-1,sizeof(head));
      }
      
      inline void add(int u,int v,int d){
      	cnt++;
      	e[cnt].to=v;
      	e[cnt].v=d;
      	e[cnt].next=head[u];
      	head[u]=cnt;
      }
      
      void dijk(){
      	dis[s]=0;
      	Cnt[s] = 1;
      	pq.push((node){0,s});
      	while(!pq.empty()){
      		node tem=pq.top();
      		pq.pop();
      		int x=tem.pos,d=tem.dis;
      		if(ok[x]){
      			continue;
      		}
      		ok[x]=1;
      		for(int i=head[x];~i;i=e[i].next){
      			int y=e[i].to;
      			if(dis[y]>dis[x]+e[i].v){
      				dis[y]=dis[x]+e[i].v;
      				Cnt[y] = 0;
      				if(!ok[y]){
      					pq.push((node){dis[y],y});
      				}
      			}
      			if(dis[y] == dis[x] + e[i].v) {
      				Cnt[y] = (Cnt[y] + Cnt[x]) % mod;
      			}
      		}
      	}
      }
      
      int main(){
      	while(scanf("%d%d%d",&n,&m,&s)==3){
      	init();
      	for(int i=1;i<=n;i++){
      		dis[i]=inf;
      	}
      	for(int i=1,u,v,d;i<=m;i++){
      		scanf("%d%d%d",&u,&v,&d);
      		add(u,v,d);
      	}
      	dijk();
      	for(int i=1;i<=n;i++){
      		if(i<n) printf("%lld ",dis[i]);
      		else printf("%lld\n",dis[i]);
      	}
      	}
      	return 0;
      } 
      
      

      例1
      1018 Public Bike Management

      這題需要求出所有的最短路徑,再依次判定。只貪心做是錯的

      點擊查看代碼
      #include<bits/stdc++.h>
      #define ll long long
      using namespace std;
      const int N = 500 + 50;
      int n, m, a[N], st, en, Hold;
      struct Node{
      	int id;
      	ll dis;
      	vector<int> Path;
      	bool operator < (const Node &aa) const{
      		return dis > aa.dis;
      	}
      };
      bool vis[N];
      ll dis[N];
      struct node{
      	int to, d;
      };
      vector<node> e[N];
      ll ans = 1e18, ans2 = 1e18;
      vector<int> an;
      
      void check(vector<int> v) {
      	ll Need = 0, Collect = 0;
      	for(auto x : v) {
      		// cout << x << ' ';
      		if(x == st) continue;
      		x = a[x];
      		if(x >= Hold) Collect += x - Hold;
      		else {
      			ll tmp = Hold - x;
      			if(Collect >= tmp) {
      				Collect -= tmp;
      				continue;
      			}
      			else {
      				tmp -= Collect;
      				Collect = 0;
      				Need += tmp;
      			}
      		}
      	}
      	if(Need < ans) {
      		ans = Need; ans2 = Collect;
      		an = v;
      	}
      	else if(Need == ans && Collect < ans2) {
      		ans2 = Collect;
      		an = v;
      	}
      }
      
      void dijk(int s) {
      	for(int i = 0; i <= n; i++) {
      		vis[i] = 0;
      		dis[i] = 1e18;
      	}
      	priority_queue<Node> Q;
      	Q.push({s, 0, {s}});
      	dis[s] = 0;
      	while(!Q.empty()) {
      		Node now = Q.top();
      		Q.pop();
      		int u = now.id;
      		// if(vis[u] && u != en) continue;
      		if(dis[u] < now.dis) continue;
      		if(u == en) {
      			check(now.Path);
      			continue;
      		}
      		// cout << u << ' ' << now.fa << endl; ////
      		for(auto v : e[u]) {
      			if(dis[v.to] >= dis[u] + v.d) {
      				dis[v.to] = dis[u] + v.d;
      				auto tem = now.Path; tem.push_back(v.to);
      				Q.push({v.to, dis[v.to], tem});
      			}
      		}
      	}
      }
      
      int main () {
      	cin >> Hold >> n >> en >> m;
      	st = 0;  Hold /= 2;
      	for(int i = 1; i <= n; i++) cin >> a[i];
      	for(int i = 1, u, v, w; i <= m; i++) {
      		cin >> u >> v >> w;
      		e[u].push_back((node){v, w});
      		e[v].push_back((node){u, w});
      	}
      	dijk(st);
      	cout << ans << ' ';
      	for(int i = 0; i < an.size(); i++) {
      		if(i == 0) cout << an[i];
      		else cout << "->" << an[i];
      	}
      	cout << ' ' << ans2 << endl;
          return 0;
      }
      

      例2
      1131 Subway Map

      這題可以bfs or dfs

      最小生成樹

      搞清楚 \(prim\)\(kruscal\) 兩種算法

      posted @ 2023-08-31 18:18  starlightlmy  閱讀(16)  評論(0)    收藏  舉報
      主站蜘蛛池模板: 欧洲精品码一区二区三区| 国产精品中文第一字幕| 人妻久久久一区二区三区| 国产精品无码免费播放| 蜜臀视频在线观看一区二区| 噜噜久久噜噜久久鬼88| 国产不卡一区二区在线| 亚洲综合一区国产精品| 亚洲午夜爱爱香蕉片| 婷婷开心深爱五月天播播| 亚洲一级特黄大片在线观看| 国产目拍亚洲精品二区| 国产无吗一区二区三区在线欢| 国产精品男女爽免费视频| 国产精品日韩中文字幕| 亚洲色偷偷色噜噜狠狠99| 国产美女午夜福利视频| 国产精品免费重口又黄又粗 | 日韩人妻中文字幕精品| 韩国 日本 亚洲 国产 不卡| 国产av普通话对白国语| 国产精品普通话国语对白露脸 | 久久自己只精产国品| 成人三级视频在线观看不卡| 观塘区| 风流老熟女一区二区三区| 国产色爱av资源综合区| 一区二区中文字幕av| 亚洲老妇女亚洲老熟女久| 成人性影院| 蜜臀午夜一区二区在线播放| 国产色无码专区在线观看| 人妻少妇精品无码专区二区| 久久精品熟女亚洲av艳妇| 四虎成人精品永久网站| 日本强伦片中文字幕免费看| 亚洲精品一区国产欧美| 亚洲精品免费一二三区| 8x国产精品视频| 人妻少妇精品系列一区二区| 国产一二三区在线|