日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 编程资源 > 编程问答 >内容正文

编程问答

nyoj-20-吝啬的国度(深搜)

發布時間:2023/12/10 编程问答 50 豆豆
生活随笔 收集整理的這篇文章主要介紹了 nyoj-20-吝啬的国度(深搜) 小編覺得挺不錯的,現在分享給大家,幫大家做個參考.

吝嗇的國度

時間限制:1000?ms ?|? 內存限制:65535?KB 難度:3 描寫敘述
在一個吝嗇的國度里有N個城市。這N個城市間僅僅有N-1條路把這個N個城市連接起來。如今,Tom在第S號城市,他有張該國地圖。他想知道如果自己要去參觀第T號城市。必須經過的前一個城市是幾號城市(如果你不走反復的路)。 輸入
第一行輸入一個整數M表示測試數據共同擁有M(1<=M<=5)組
每組測試數據的第一行輸入一個正整數N(1<=N<=100000)和一個正整數S(1<=S<=100000)。N表示城市的總個數,S表示參觀者所在城市的編號
隨后的N-1行。每行有兩個正整數a,b(1<=a,b<=N),表示第a號城市和第b號城市之間有一條路連通。
輸出
每組測試數據輸N個正整數,當中。第i個數表示從S走到i號城市,必需要經過的上一個城市的編號。

(當中i=S時,請輸出-1)

例子輸入
1 10 1 1 9 1 8 8 10 10 3 8 6 1 2 10 4 9 5 3 7
例子輸出
-1 1 10 10 9 8 3 1 1 8

解題思路:

? ? ? 一開始用了隊列來求,起點入隊。然后出隊。找到跟起點相連的城市進隊,那么這些城市的前一步就是出隊的城市了,然后開始不停地出隊入隊,直到隊空為止。思路不錯。可是超時了。

? ? ? 經過看大神的代碼,發現這個題能夠用深搜來解決,再一看題目發現這確實符合深搜的特性。

? ? ?無論是隊列還是深搜,都須要標記。

? ? ?隊列用到了#include<queue>STL函數,

#include <iostream> #include <queue> using namespace std; //這幾個頭文件不可缺少int main() { queue<類型(如int)> q; //使用前需定義一個queue變量,且定義時已經初始化 while(!q.empty()) q.pop(); //反復使用時,用這個初始化(空則返回1,不空返回0) q.push(1); //進隊列 q.pop(); //出隊列 int v=q.front(); //得到隊首的值 int s=q.size(); //得到隊列里元素個數return 0; }
? ? ? 由于給定的城市N的數目太大,建立數組須要用到#include<vector>,vector就是一個不定長數組,vector<int>a就是一個類似于int a[]的整數數組,僅僅只是他的長度不確定。能夠用a.size()讀取他的長度。

? ? ? 而vector<int>a[max]就是一個二維數組,僅僅是第一維的大小是固定的(不超過max),二維的大小就不固定了,這道題之所以用到vector就是利用了他的不定長,假設直接建立二維數組a[n][n]。n太大了,這種二維數組絕對超出內存。

? ? ??(1)頭文件#include<vector>.

? ? ? (2)創建vector對象,vector<int> vec;

? ? ? (3)尾部插入數字:vec.push_back(a);

? ? ? (4)使用下標訪問元素。cout<<vec[0]<<endl;記住下標是從0開始的。

? ? ? (5)向量大小:vec.size();

代碼:

//隊列思路(超時) #include<stdio.h> #include<string.h> #include<iostream> #include<queue> using namespace std; int sta[110000]; int map[110000][3]; int ans[110000]; int main() {int m;int n,s;int i,j,k;int now;queue<int>q;scanf("%d",&m);while(m--){scanf("%d%d",&n,&s);q.push(s);for(i=1;i<n;i++){map[i][0]=1;scanf("%d%d",&map[i][1],&map[i][2]);}memset(ans,0,sizeof(ans));ans[s]=-1;while(!q.empty()){now=q.front();q.pop();for(i=1;i<n;i++){if(map[i][0]&&map[i][1]==now){q.push(map[i][2]);ans[map[i][2]]=now;map[i][0]=0;}else if(map[i][0]&&map[i][2]==now){q.push(map[i][1]);ans[map[i][1]]=now;map[i][0]=0;}}}for(i=1;i<=n;i++){printf("%d",ans[i]);if(i!=n)printf(" ");elseprintf("\n");}}return 0; } //深搜代碼(AC) #include<stdio.h> #include<string.h> #include<iostream> #include<vector> #include<algorithm> using namespace std; int pre[100005]; vector<int>v[100005];void dfs(int s) {int i;for(i=0;i<v[s].size();i++){if(pre[v[s][i]])continue;pre[v[s][i]]=s;dfs(v[s][i]);} } int main() {int m;int n,s;int a,b;int i,j;scanf("%d",&m);while(m--){memset(v,0,sizeof(v));memset(pre,0,sizeof(pre));scanf("%d%d",&n,&s);pre[s]=-1;for(i=0;i<n-1;i++){scanf("%d%d",&a,&b);v[a].push_back(b);v[b].push_back(a);}dfs(s);for(i=1;i<=n;i++){printf("%d",pre[i]);if(i!=n)printf(" ");elseprintf("\n");}}return 0; }


轉載于:https://www.cnblogs.com/brucemengbm/p/6892334.html

總結

以上是生活随笔為你收集整理的nyoj-20-吝啬的国度(深搜)的全部內容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。