首页 > 学院 > 开发设计 > 正文

图的基本存储的基本方式二

2019-11-08 01:55:29
字体:
来源:转载
供稿:网友

图的基本存储的基本方式二 Time Limit: 1000MS Memory Limit: 65536KB Submit Statistic PRoblem Description

解决图论问题,首先就要思考用什么样的方式存储图。但是小鑫却怎么也弄不明白如何存图才能有利于解决问题。你能帮他解决这个问题么? Input

多组输入,到文件结尾。 每一组第一行有两个数n、m表示n个点,m条有向边。接下来有m行,每行两个数u、v代表u到v有一条有向边。第m+2行有一个数q代表询问次数,接下来q行每行有一个询问,输入两个数为a,b。 注意:点的编号为0~n-1,2<=n<=500000 ,0<=m<=500000,0<=q<=500000,a!=b,输入保证没有自环和重边 Output

对于每一条询问,输出一行。若a到b可以直接连通输出Yes,否则输出No。 Example Input

2 1 0 1 2 0 1 1 0 Example Output

Yes No

#include <stdio.h>#include <stdlib.h>typedef struct node{ int data; struct node *next;}node;int main(){ int n,m,u,v; int i; int a,b,q; node *head[500000],*p,*tail,*temp; while(~scanf("%d %d",&n,&m)){ for(i=0; i<n; i++)//初始化节点,一开始图的每个节点都设为空 head[i] = NULL; while(m--){ scanf("%d %d",&u,&v); if(head[u]==NULL){//当个图的节点为空的时,给他分配内存,在把这个节点到另一个有向边的位置存到这个节点的数据域 head[u] = (node *)malloc(sizeof(struct node)); head[u]->data = v; head[u]->next = NULL;//下一个为空,千万别忘记 } else{ temp = head[u]->next;//如果这个节点已经有了边的话,那就逆序建立链表 p = (node *)malloc(sizeof(struct node)); p->data = v; p->next = temp; head[u]->next = p;// tail = head[u];// p = (node *)malloc(sizeof(struct node));//不知道为什么顺序建就不行,哪位老铁能给我解释解释// p->data = v;// p->next = NULL;// tail->next = p;// tail = p; } } scanf("%d",&q); while(q--){ int f = 0; scanf("%d %d",&a,&b); if(head[a]==NULL) printf("No/n"); else{ temp = head[a]; while(temp){ if(temp->data==b){ f = 1; break; } temp = temp->next; } if(f)//这里要注意的是if判断放在大else里面,要不然如果是No的话,会输出两个的 printf("Yes/n"); else printf("No/n"); } } } return 0;}
上一篇:final修饰符

下一篇:springmvc限流拦截器

发表评论 共有条评论
用户名: 密码:
验证码: 匿名发表