1.数组弱智储存 当节点多路少时耗费空间
2.邻接链表
(1)有向 head[i]里放数 好像比较复杂 直接从head->next 好像比较简单 参考无向吧
这里指针数组 用的时候要new
struct node
{
int data;
node *next;
};
node *head[500001];
int main()
{
int n,m,a,b,i,t;
node *p,*q;
while(~scanf("%d %d",&n,&m))
{
//先初始化相当于memset
for(i=0; i<n; i++)
{
head[i]=NULL;
}
//建表 如果是第一个直接插入 其他头插
for(i=0; i<m; i++)
{
cin >> a >> b;
if(head[a]==NULL)
{
head[a] = new node;
head[a]->data = b;
head[a]->next = NULL;
}
else
{
q = head[a]->next;
p = new node;
p->next = q;
p->data = b;
head[a]->next =p;
}
}
cin>>t;
//遍历head[i]所有节点 看有没有通往b
while(t--)
{
int flag = 0;
cin >> a >> b;
if(head[a]==NULL)
{
cout << "No" <<endl;
}
else
{
q = head[a];
while(q!=NULL)
{
if(q->data == b)
{
flag = 1;
break;
}
q = q->next;
}
// 放在else 里面 否则是头节点 输出两个no
if(flag == 1)cout << "Yes" <<endl;
else cout << "No" <<endl;
}
}
} return 0;
}
(2)无向(这样好像可以方便head后面的节点排序 不过都能排 就这样吧
for(i=0;i<k;i++){
head[i] = new node;
head[i]->next = NULL;
}
while(m--){
cin >> u >> v;
p = new node;
p ->data = v;
p->next = head[u]->next;
head[u]->next = p;
p = new node;
p ->data = u;
p->next = head[v] ->next ;
head[v]->next = p;
}
3.可变长数组vector 先这样吧 之后再加
#include <vector>
const int maxn = 10000;
vector<int>a[maxn];//二维数组
int main(){
清空
for(i=0;i<n;i++)a[i].clear();
储存
cin >> u >> v;
a[u].push_back(v);//末尾添加元素
a[v].push_back(u);
遍历
for(i=0;i<a[u].size();i++){
if(a[u][i]==v)
cout << "YES" <<endl;
}
return 0;
}