vj传送门
给你一个t,问有多少个与t相邻的点,那条边真真实实存在。(本题有向图)
可以发现:
5. 当v里没元素时,即动态数组为空,v.size()输出是0.
6. 可当我放一个元素进去时,再输出v.size()-2就奇异了,并不是-1而是一个很大的数,而当赋值给一个int len 时,再输出就不会了。
7. 后面我用printf进行实验,谜底就解开了,其实v.size是unsign int型,而cout不用占位符,所以输出时就应该是unsigne int 输出
许多初学者(包括我)在使用时都直接把它当作数组使用,其实是不一样的.vector是动态数组,使用前需要分配空间,跳过这一步直接调用成员函数,可能会有莫名RE
#include
#include
#include
#include
#include
#include
#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;
}
#include
#include
#include
#include
#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 dis[maxn],vis[maxn],head[maxn];
int in[maxn];
void add(int bg, int ed, int v)
{
e[++cnt]=EDGE(ed,v,head[bg]);
head[bg]=cnt;
in[bg]++;
//cout<
// cout<
//cout<
}
void dij(int s)
{
For(i,0,n-1){vis[i]=0;dis[i]=INF;in[i]=0;}
//priority_queueq;
queue<pa>q;
//dis[s]=0;//q.push(mp(0,s));
for(int i=head[s]; i!=-1; i=e[i].next)
{
int v=e[i].to;
in[v]++;
q.push(mp(v,v));
}
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
{
vis[u]++;
}
// cout<
for(int i=head[u]; i!=-1; i=e[i].next)
{
int v=e[i].to,w=e[i].v;
if(v==s)
{
continue;
}
else if(in[v]&&fa!=v)
{
in[v]=0;
continue;
}
// cout<
q.push(mp(v,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);
add(y,x,1);
}
dij(t);
int ans=0;
For(i,0,n-1)
{
if(in[i]==1&&i!=t)ans++;
// cout<
}
// For(i,0,n-1)
// {
// if(in[i]==1&&i!=t)
// {
// int v=head[i];
// cout<<"v="<
// cout<
// if(e[v].to==t)
// {
// ans++;
// vis[i]=1;
// }
// }
//cout<
// }
// cout<
cout<<ans<<endl;
For(i,0,n-1)if(in[i]==1&&i!=t)cout<<i<<endl;
return 0;
}