1. 程式人生 > >圖論 補圖最短路->bfs+set

圖論 補圖最短路->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)。最短路徑有很多特殊的情況,包括有向圖還是無向