GYM 102501K
題意:
給你一個t,問有多少個與t相鄰的點,那條邊真真實實存在。(本題有向圖)
思路:
- 反向建圖,之後把問題轉換成,從與t相鄰的點出發。
- 把每個與t相鄰的點,構建祖先爲其本身。
- 跑bfs,
- 如果一個點有多次訪問,那麼可能就對這個點有多條路,而因爲是以每個與t相鄰的點爲起點,所以當祖先和待訪問的節點相同時,就說明由自己走向自己,不操作,
- 當不是祖先時,就訪問,並標記。
- 最後統計與t相鄰的點(只訪問過一次。)
反思:
- 本題讓我對bfs有了更深層次的理解(水題刷少了,bfs只會dij,沒什麼用,對隊友沒貢獻)
- 本次對於vector真是大失敗,不會瞎用,訓練的時候做不出來就算了,之後補提時RE。
- 下面開始對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正確的做法
- 用其內部的構造函數給他分配空間,or push_back().
- 分配後的動態數組就和正常數組差不多了。
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;
}