UVa1599 Ideal Path(雙向bfs+佇列判重)
紫書上的一道例題,題目連結
做兩次bfs,第一次記錄可達n的點到n的距離,到點1為止
第二次 要在距離滿足上一個點-1的基礎上找邊的最小值,這道題並不需要找到一條路徑,只需要輸出邊的值即可,所以即便有多條邊,也直接記錄最小值就好了。
需要注意的一點,為了避免超時,需要加一個優化,用v陣列來記錄點是否被加入到佇列中,即佇列去重
#include <bits/stdc++.h>
#define ll long long
#define pb push_back
#define inf 0x3f3f3f3f
#define rep(i,a,b) for(int i=a;i<b;i++)
#define rep1(i,a,b) for(int i=a;i>=b;i--)
#define rson rt<<1|1,m+1,r
#define lson rt<<1,l,m
using namespace std;
const int N=1e5+10;
int arr[N],vis[N],res[N],v[N];
struct node
{
int b,c;
};
vector<node>G[N];
int main()
{
ios::sync_with_stdio(false);
int n,m;
while (cin>>n>>m)
{
memset(vis,0,sizeof vis);
memset(res,0,sizeof res);
memset(v,0,sizeof v);
for(int i=0;i<N;i++)
G[i].clear();
rep(i,0,m)
{
int a,b,c;
cin>>a>>b>>c;
G[a].pb({b,c});
G[b].pb({a,c});
}
queue <int>q;
q.push(n);
vis[n]=1;
while(!q.empty())
{
int a=q.front();
q.pop();
int pp=0;
rep(i,0,G[a].size())
{
node y=G[a][i];
if(!vis[y.b])
{
vis[y.b]=vis[a]+1;
q.push(y.b);
if(y.b==1)
{pp=1;break;}
}
}
if(pp) break;
}
while(!q.empty())
q.pop();
q.push(1);
while(!q.empty())
{
int a=q.front();
q.pop();
int mi=inf,pp=0;
if(a==n)break;
rep(i,0,G[a].size())
{
node y=G[a][i];
if(vis[y.b]==vis[a]-1)
mi=min(y.c,mi);
}
rep(i,0,G[a].size())
{
node y=G[a][i];
if(!v[y.b]&&vis[y.b]==vis[a]-1&&y.c==mi)
{
q.push(y.b);
v[y.b]=1;
}
}
int index=vis[1]-vis[a];
if(res[index]==0)res[index]=mi;
else res[index]=min(res[index],mi);
}
cout<<vis[1]-1<<endl<<res[0];
rep(i,1,vis[1]-1)
cout<<' '<<res[i];
cout<<endl;
}
return 0;
}
相關推薦
UVa1599 Ideal Path(雙向bfs+佇列判重)
紫書上的一道例題,題目連結 做兩次bfs,第一次記錄可達n的點到n的距離,到點1為止 第二次 要在距離滿足上一個點-1的基礎上找邊的最小值,這道題並不需要找到一條路徑,只需要輸出邊的值即可,所以即便有多條邊,也直接記錄最小值就好了。 需要注意的一點,為了避
UVA 1599 Ideal Path(雙向bfs+字典序+非簡單圖的最短路+隊列判重)
ems code can scan min 時機 define index end https://vjudge.net/problem/UVA-1599 給一個n個點m條邊(2<=n<=100000,1<=m<=200000)的無向圖,每條邊上都塗
【雙向bfs(一次可也)】【非簡單圖的最短路】UVa1599 Ideal Path 【紫書6-20經典例題】【無向圖求字典序最小的最短路】
【雙向bfs(一次也可)】【非簡單圖的最短路】UVa1599 Ideal Path 【紫書6-20經典例題】【無向圖求字典序最小的最短路】 New labyrinth attraction is open in New Lostland amusement p
1599 Ideal Path (一遍樹上BFS)
UVA - 1599 Ideal Path New labyrinth attraction is open in New Lostland amusement park. The labyrinth consists of n rooms connected by
第十場 hdu 6171 Admiral(雙向bfs找交點)
pos 交換 size php log print 如果 雙向 dmi http://acm.hdu.edu.cn/showproblem.php?pid=6171 題目大意:給你一個塔形的數據共有1個0、2個1、3個2、4個3、5個4、6個5.你能夠把0這個數據和它的
Nightmare Ⅱ(雙向BFS)
clu next 什麽是 separate contains 我們 dream 人的 before Problem Description Last night, little erriyue had a horrible nightmare. He dreamed
Infinite Fraction Path(HDU6223 + bfs + 剪枝)
都是 deb print ins fin ini efi math debug 題目鏈接: http://acm.hdu.edu.cn/showproblem.php?pid=6223 題目: 題意: 給你一個長度為n的數字串,開始時你選擇一個位置(記為
hdu3085Nightmare Ⅱ(雙向BFS)
傳送門:http://acm.hdu.edu.cn/showproblem.php?pid=3085 Nightmare Ⅱ Time Limit: 2000/1000 MS (Java/Others) Memory Limit: 32768
初次學習(雙向 bfs)
為了記錄一下自己學過的東西 雙向BFS,既然是雙向的,那麼就得知道起點和終點,這樣,我們就可以進行雙向搜尋了。 但是,雙向BFS是否真的可以提高效率呢?如果能,那麼又能提高多少呢? 看到過一個圖,說雙BFS可以在BFS的基礎上把時間和空間複雜度上都減半。實際上
FZU 2180 騎士 (雙向BFS)
#include<stdio.h> #include<string.h> #include<map> #include<queue> #include<algorithm> #define inf 1e8 using namespace std; c
hdu3085(雙向BFS)
題意:erriye 夢見女友被困在迷宮裡了,現在 erriye 需要去解救他的的女友 題意:給出他女友和他的位置 題意:迷宮裡有兩個ghost,每秒鐘會分生出多個ghost佔據在他2步之內的所有格子 題意:little erriye 每秒可以移動3步 題意:grilfri
uva1601(雙向BFS經典題)
單向: /* solution: 還是隱式圖搜尋問題,類似dijkstra,用bfs解決,這個是單向搜尋,弊端是有時候隨著搜尋 的深入,可擴充套件的結點會越來越多,造成效率變慢,用雙向bfs可以解決這個問題 note: 隱式圖
POJ 1094 Sorting It All Out(拓撲排序判環)
sse next lan multipl sequence posit and ann sed 題目鏈接:http://poj.org/problem?id=1094 題目: Description An ascending sorted sequence of di
HDU 4324 Triangle LOVE(拓撲排序判環)
rip tdi relation out std program there tour cst 題目鏈接:http://acm.hdu.edu.cn/showproblem.php?pid=4324 題目: Problem Description Recently,
HDU 3342 Legal or Not(拓撲排序判環)
題解 eas n-1 all day sim contain target there 題目鏈接:http://acm.hdu.edu.cn/showproblem.php?pid=3342 題目: Problem Description ACM-DIY is a l
【POJ】2373 Dividing the Path(單調隊列優化dp)
space eof span AC pty 其中 get else href 題目 傳送門:QWQ 分析 聽說是水題,但還是沒想出來。 $ dp[i] $為$ [1,i] $的需要的噴頭數量。 那麽$ dp[i]=min(dp[j])+1 $其中$
2018.10.29 bzoj1023: [SHOI2008]cactus仙人掌圖(仙人掌+單調佇列優化dp)
傳送門 求仙人掌的直徑。 感覺不是很難。 分點在環上面和不在環上分類討論。 不在環上直接樹形 d p
雙鏈表(雙向帶頭迴圈連結串列)
雙向連結串列 雙向連結串列也叫雙鏈表,是連結串列中的一種。它的每個資料結點中都有兩個指標,分別指向直接前驅和直接後繼,所以從連結串列的任意一個結點都可以很方便的訪問到它的前驅結點和後繼結點,一般我們都構造雙向迴圈連結串列。 ## 帶頭結點和不帶頭結點 其實這個帶頭結點和不帶
C - Crusaders Quest (棧和佇列的運用)
滴答滴答---題目連結 Crusaders Quest is an interesting mobile game. A mysterious witch has brought great darkness to the game world, and the only hope
資料結構-線性表(棧與佇列基本概念)
棧(stack,zhan):是限定僅在表尾進行插入和刪除操作的線性表。 把允許插入和刪除的一端稱為棧頂(top),另一端稱為棧底(bottom),不含任何資料元素的棧稱為空棧。棧又稱為後進先出(Last In First Out)的線性表,簡稱LIFO結構。 棧是一個線性表,棧元素