bfs求重複路徑(v.size是unsign int)

GYM 102501K

vj傳送門

在這裏插入圖片描述
在這裏插入圖片描述
在這裏插入圖片描述
在這裏插入圖片描述

題意:

給你一個t,問有多少個與t相鄰的點,那條邊真真實實存在。(本題有向圖)

思路:

  1. 反向建圖,之後把問題轉換成,從與t相鄰的點出發。
  2. 把每個與t相鄰的點,構建祖先爲其本身。
  3. 跑bfs,
  4. 如果一個點有多次訪問,那麼可能就對這個點有多條路,而因爲是以每個與t相鄰的點爲起點,所以當祖先和待訪問的節點相同時,就說明由自己走向自己,不操作,
  5. 當不是祖先時,就訪問,並標記。
  6. 最後統計與t相鄰的點(只訪問過一次。)

反思

  1. 本題讓我對bfs有了更深層次的理解(水題刷少了,bfs只會dij,沒什麼用,對隊友沒貢獻)
  2. 本次對於vector真是大失敗,不會瞎用,訓練的時候做不出來就算了,之後補提時RE。
  3. 下面開始對vector進行實驗:
    在這裏插入圖片描述

可以發現:
3. 當v裏沒元素時,即動態數組爲空,v.size()輸出是0.
4. 可當我放一個元素進去時,再輸出v.size()-2就奇異了,並不是-1而是一個很大的數,而當賦值給一個int len 時,再輸出就不會了。
5. 後面我用printf進行實驗,謎底就解開了,其實v.size是unsign int型,而cout不用佔位符,所以輸出時就應該是unsigne int 輸出

vector使用誤區(樓主的sb做法qwq)

許多初學者(包括我)在使用時都直接把它當作數組使用,其實是不一樣的.vector是動態數組,使用前需要分配空間,跳過這一步直接調用成員函數,可能會有莫名RE

vector正確的做法

  1. 用其內部的構造函數給他分配空間,or push_back().
  2. 分配後的動態數組就和正常數組差不多了。

AC

#include <iostream>
#include <cstdio>
#include <queue>
#include <algorithm>
#include <cstring>
#include <vector>
#define For(i,x,y) for(register int i=(x); i<=(y); i++)
#define mp make_pair
#define fi first
#define se second
#define pb push_back
#define mst(x,a) memset(x,a,sizeof(x))
#define fzhead EDGE(int _to, int _v, int _next)
#define fzbody to(_to),v(_v),next(_next)
using namespace std;
typedef long long ll;
typedef pair<int,int>pa;
const int maxn=1e5+10;
const int INF=0x3f3f3f3f;
int n,m,t,cnt;
struct EDGE
{
    int to,next,v;
    EDGE(){}
    fzhead:fzbody{}
}e[maxn];
int vis[maxn],head[maxn];
vector<int>b;
void add(int bg, int ed, int val)
{
    e[++cnt]=EDGE(ed,val,head[bg]);
    head[bg]=cnt;
 }
void spfa(int s)
{
      queue<pa>q;
    for(int i=head[s]; i!=-1; i=e[i].next)
    {
        q.push(mp(e[i].to,e[i].to));
    }
     while(!q.empty())
    {
        int u=q.front().fi,fa=q.front().se;
        q.pop();
        if(vis[u]>=3)continue;
        if(!vis[u])vis[u]=1;
        else
        {
            if(u!=fa)vis[u]++;
            else continue;
        }
        for(int i=head[u]; i!=-1; i=e[i].next)
        {
            int va=e[i].to;
            if(va==s)continue;
            q.push(mp(va,fa));
        }
    }
}
int main()
{
    scanf("%d%d%d",&n,&m,&t);
    mst(head,-1);
    For(i,1,m)
    {
        int x,y;
        scanf("%d%d", &x,&y);
      add(y,x,1);
    }
    spfa(t);
    for(int i=head[t];i!=-1; i=e[i].next)
    {
        int u=e[i].to;
        if(vis[u]==1)
        {
            b.push_back(u);
        }
    }
    cout<<b.size()<<endl;
    sort(b.begin(),b.end());
   int b.size();
    For(i,0,len-1)cout<<b[i]<<endl;
   return 0;
}
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章