题目链接 :http://acm.sdut.edu.cn/sdutoj/showproblem.php?pid=3467&cid=1674
图的基本存储的基本方式四
Time Limit: 2500MS Memory limit: 10000K
题目描述
解决图论问题,首先就要思考用什么样的方式存储图。但是小鑫却怎么也弄不明白如何存图才能有利于解决问题。你能帮他解决这个问题么?
输入
多组输入,到文件结尾。
保证可达边的数量不超过1000
每一组第一行有一个数n表示n个点。接下来给出一个n*n的矩阵 表示一个由邻接矩阵方式存的图。
矩阵a中的元素aij如果为0表示i不可直接到j,1表示可直接到达。
之后有一个正整数q,表示询问次数。
接下来q行每行有一个询问,输入两个数为a,b。
保证可达边的数量不超过1000
输出
对于每一条询问,输出一行。若
a
到
b
可以直接连通输出
Yes
,否则输出
No
。
示例输入
2 0 1 0 0 2 0 1 1 0
示例输出
Yes No
提示
来源
LeiQ
示例程序
- #include <cstdio>
- #include <cstring>
- $include <algorithm>
- using namespace std;
- struct node
- {
- int d;
- node *next;
- }*q,*head[5005];
- int main()
- {
- int n, i, j, t, u, v, x;
- while(~scanf("%d", &n))
- {
- for(i=0;i<n;i++)
- {
- head[i]=new node;
- head[i]->next=NULL;
- }
- for(i=0;i<n;i++)
- for(j=0;j<n;j++)
- {
- scanf("%d", &x);
- if(x)
- {
- node *p=new node;
- p->next=NULL;
- p->d=j;
- if(head[i]->next==NULL)
- {
- p->next=head[i]->next;
- head[i]->next=p;
- }
- else
- {
- q=head[i]->next;
- p->next=q;
- head[i]->next=p;
- }
- }
- }
- scanf("%d", &t);
- while(t--)
- {
- int f=0;
- scanf("%d %d", &u, &v);
- if(head[u]->next==NULL) printf("No\n");
- else
- {
- node *s=head[u]->next;
- while(s!=NULL)
- {
- if(s->d==v) {f=1;break;}
- s=s->next;
- }
- if(f) printf("Yes\n");
- else printf("No\n");
- }
- }
- }
- return 0;
- }