圖論 補圖最短路->bfs+set
hdu5877
題意:T組樣例,沒組n個點,m條邊, 再輸入一個點k,k<n,求k到補圖中各點的最短路。
題解:用set 去存不相鄰的點,然後累計增加長度,
#include <cstdio> #include <iostream> #include <cstring> #include <algorithm> #include <set> #include <queue> using namespace std; const int INF=0x7f7f7f; const int maxn=200005; struct Edge{ int to,from; }edge[maxn]; int head[maxn],top; int n,m; int dis[maxn]; int into(){ memset(head,-1,sizeof(head)); memset(dis,INF,sizeof(dis)); top=0; } void add(int u,int v){ edge[top].to=u; edge[top].from=head[v]; head[v]=top++; } int bfs(int st){ set<int> s1; set<int> s2; set<int>::iterator it; //除了st 計算的這個點其他都收到s1 集合裡 for(int i=1;i<=n;i++) if(i!=st) s1.insert(i); queue<int>q; q.push(st); dis[st]=0;//只能在st的基礎上加 while(!q.empty()){ int u=q.front(); q.pop(); for(int i=head[u];i!=-1;i=edge[i].from){ int to=edge[i].to; //s1集合裡沒有就跳過 if(!s1.count(to)) continue; //s1集合裡有,把這個點放到 s2裡面 //s1集合裡有,說明點u和這些點相鄰 // 但是我們要計算不相鄰的,所以拿出來單獨考慮 s1.erase(to); s2.insert(to); } //s1中現在存的是 和u點不相鄰的數 //s2中現在存的是和u相鄰的數 for(it=s1.begin();it!=s1.end();it++){ q.push(*it); //點到u的距離+1 dis[*it]=dis[u]+1; } //換回去,再次比較 s1.swap(s2); s2.clear(); } } int main() { int T; scanf("%d",&T); while(T--){ scanf("%d%d",&n,&m); into(); for(int i=1;i<=m;i++){ int u,v; scanf("%d%d",&u,&v); add(u,v);add(v,u); } int stt; scanf("%d",&stt); bfs(stt); // 輸出結果 for(int i=1;i<=n;i++){ if(i==stt) continue; //i沒走過 if(dis[i]==INF) printf("-1"); else printf("%d",dis[i]); if(i==n) printf("\n"); else printf(" "); } } return 0; }
相關推薦
圖論 補圖最短路->bfs+set
hdu5877 題意:T組樣例,沒組n個點,m條邊, 再輸入一個點k,k<n,求k到補圖中各點的最短路。 題解:用set 去存不相鄰的點,然後累計增加長度, #include <cstdio> #include <iostream> #in
NBUT OJ 1642 簡單的圖論問題? 最短路問題,BFS
相信第一個最短路問題應該幾乎都是沒什麼問題的。。直接跑BFS就可以了,第二個。我感覺和這裡的題目有點像 POJ 1724 同樣都是在約束條件下的最短路,因此解決這些問題的方法應該也是類似的,我先闡述這個問題吧,那個問題我以後在寫一篇部落
POJ 3268 迪傑斯特拉圖論 置換找最短路
繼續 with style pro end #define farm sca .net 題目:https://vjudge.net/problem/POJ-3268 One cow from each of N farms (1 ≤ N ≤ 1000) conveni
[matlab] 22.matlab圖論實例 最短路問題與最小生成樹 (轉載)
dijkstra 分享 data 幫助 存儲 生成樹 jks lap open 最短路問題之 Floyd 某公司在六個城市 c1c1,c2c2,….,c6c6 中有分公司,從 cici 到 cjcj 的直接航程票價記在下述矩陣的 (ii,jj) 位置上。
圖論演算法講解--最短路--Dijkstra演算法
一.緒論 要學習最短路演算法我們首先應該知道什麼是圖以及什麼是最短路。 圖在離散數學中的定義為:圖G=(V,E)是一個二元組(V,E)使得E⊆[V]的平方,所以E的元素是V的2-元子集。為了避免符號上的混淆,我們總是預設V∩B=Ø。集合V中的元素稱為圖G的定
ACM-圖論-同餘最短路
https://www.cnblogs.com/31415926535x/p/11692422.html 一種沒見過的處理模型,,記錄一下,,主要是用來處理一個多元一次方程的解的數量的問題,,資料量小時可以用看成揹包處理,,資料很大時可以轉換成最短路模型+一點數學來處理,,(體積模域下的最短路的問題,,求的一
hdu5876(求補圖的最短路,set用法)
In graph theory, the complement of a graph G is a graph H on the same vertices such that two distinct vertices of H are adjacent if and only if they ar
[線段樹優化建圖最短路 bfs] BZOJ 3073 [Pa2011]Journeys
#include<cstdio> #include<cstdlib> #include<algorithm> #include<set> using namespace std; inline char nc() {
圖論(三) (一) 最短路徑算法 1.Floyed-Warshall算法
路徑 最短路徑 一行 AS 個數 math stream 並且 -s 這幾周開始正式系統學習圖論,新學期開始新的記錄。由於二模和生物地理兩門高考的臨近,時間比較倉促,所以暫時跳過圖論的(一)和(二),即圖的儲存和遍歷。從最短路徑算法學起,首先要學習的是Floyed-Wars
圖論(三) (一)最短路徑算法 2.Dijkstra算法
set print turn 重復 跳過 int 算法導論 出發 AS Dijkstra 算法解決的是帶權重的有向圖上單源最短路徑問題,該算法要求所有邊的權重都為非負值。該算法的時間復雜度是O(N2),相比於處理無負權的圖時,比Bellmad-Ford算法效率更高。 算法描
圖論(三) (一)最短路徑問題 Bellman-Ford算法
描述 a算法 演變 jks truct 再次 算法理解 理解 std 簡要:Bellman-Ford算法計算的仍然是從一個點到其他所有點的最短路徑算法,其時間復雜度是O(NE),N表示點數,E表示邊數,不難看出,當一個圖稍微稠密一點,邊的數量會超過點數那麽實際上效率是低於D
PTA 7-10(圖) 旅遊規劃 最短路問題
7-10(圖) 旅遊規劃 (25 分) 有了一張自駕旅遊路線圖,你會知道城市間的高速公路長度、以及該公路要收取的過路費。現在需要你寫一個程式,幫助前來諮詢的遊客找一條出發地和目的地之間的最短路徑。如果有若干條路徑都是最短的,那麼需要輸出最便宜的一條路徑。
資料結構實驗之圖論九:最小生成樹__Prim
Problem Description 有n個城市,其中有些城市之間可以修建公路,修建不同的公路費用是不同的。現在我們想知道,最少花多少錢修公路可以將所有的城市連在一起,使在任意一城市出發,可以到達其他任意的城市。 Input 輸入包含多組資料,格式如下。 第一行包括兩個整數n m,
資料結構實驗之圖論九:最小生成樹 (SDUT 2144)
#include<bits/stdc++.h> using namespace std; typedef long long ll; struct node { int s, e; int w; }s[100005]; int c[105]; bool cmp(str
圖論四:最短路徑演算法
一、廣度優先搜尋 1、思路:距離開始點最近的點首先被賦值,最遠的點最後被賦值。 2、適用範圍:對於非負數權的無圈圖來說(單源最短路徑)。 3、演算法實現: (1)一個佇列記錄每個每個節點的編號。 (2)將起始節點入隊,將所有節點到起始節點的距離設定為無窮大,起始節點到起始節點的距離為0; (3)取
圖論六:最小生成樹
問題描述:在無向圖中找出一個最小生成樹,前提是圖是連通的。 一、Prim演算法 1、思路:貪心,每次更新每個節點的距離,使這個節點的距離最短,類似於dijkstra演算法 2、使用條件:無向連通圖 3、演算法實現: (1)找到一個起始點,(終點有沒有都無所謂),將起點的距離設為0(表示起點到起點的距
【每日演算法】【圖論】【最小邊覆蓋 & 最小路徑覆蓋 & 最小頂點覆蓋 & 最大獨立集 & 最大團】
最小邊覆蓋 = 最大獨立集 = |V| - 最大匹配數 這個是在原圖是二分圖上進行的 最小路徑覆蓋和最小邊覆蓋不同,不要求給的圖是二分圖,而是要求是N x N的有向圖,不能有環,然後根據原圖構造二分圖,構造方法是將點一分為二,如,i分為i1和i2然後如果i和j有邊,那麼就在i
BZOJ 1598 淺談AstaR啟發式搜尋有向圖網路K階最短路
世界真的很大 今天考了字串 沒看空限被86M卡空間唉,下次一定注意了 草草地學了一下這個什麼Astar演算法,也不算是完全瞭解吧就找了這道題來做做 Astar好像聽說在AI方面有很多運用,但是隻是在競賽中的話一般用做搜尋的剪枝和順序處理 這道題體現
圖論:圖的四種最短路徑演算法
本文總結了圖的幾種最短路徑演算法的實現:深度或廣度優先搜尋演算法,弗洛伊德演算法,迪傑斯特拉演算法,Bellman-Ford演算法1),深度或廣度優先搜尋演算法(解決單源最短路徑)從起始結點開始訪問所有的深度遍歷路徑或廣度優先路徑,則到達終點結點的路徑有多條,取其中路徑權值最
圖論之Dijkstra最短路徑演算法
圖論中最有名的問題可能就屬最短路徑了。最短路徑問題要求解的是:如果從圖中某一頂點(稱為源點)到達另一頂點(稱為終點)的路徑可能不止一條,如何找到一條路徑,使得沿此路徑各邊上的權值總和(即從源點到終點的距離)達到最小,這條路徑稱為最短路徑(shortestpath)。最短路徑有很多特殊的情況,包括有向圖還是無向