邻接表的建立-两种方式(模板)
2016-08-10 23:10
477 查看
/* * 构建邻接表模板 * */ #include<stdio.h> #include<string.h> int head[100100];//表头,head[i]代表起点是i的边的编号 int cnt;//代表边的编号 struct s { int u;//记录边的起点 int v;//记录边的终点 int w;//记录边的权值 int next;//指向上一条边的编号 }edge[100010]; void add(int u,int v,int w)//向所要连接的表中加入边 { edge[cnt].u=u; edge[cnt].v=v; edge[cnt].w=w; edge[cnt].next=head[u]; head[u]=cnt++; } int main() { int n; while(scanf("%d",&n)!=EOF) { int i; cnt=0; memset(head,-1,sizeof(head));//清空表头数组 for(i=0;i<n;i++) { int u,v,w; scanf("%d%d%d",&u,&v,&w); add(u,v,w); } int u,v,w; scanf("%d",&u); for(i=head[u];i!=-1;i=edge[i].next)//输出所有与起点为u相连的边的终点和权值 { v=edge[i].v; w=edge[i].w; printf("%d %d\n",v,w); } } return 0; }
#include<stdio.h> #include<vector> using namespace std; #define SIZE 1000 vector<vector<int> >adj(SIZE); int n,m; void init() { scanf("%d%d",&n,&m); int i,j; int a,b; for(i=1;i<=n;i++) { adj[i].clear(); //清除 } for(i=1;i<=m;i++) { scanf("%d%d",&a,&b); adj[a].push_back(b); adj[b].push_back(a); } } void print() { int i; int j; for(i=1;i<=n;i++) { printf("dian %d:",i); for(j=0;j<adj[i].size();j++) { printf("%d ",adj[i][j]); } printf("\n"); } } int main() { int t; scanf("%d",&t); while(t--) { init(); print(); } return 0; }
相关文章推荐
- 字符串匹配-KMP算法
- Mac PHPStorm快捷键总结
- java类里的成员变量是自身的对象问题
- Flex 布局教程:语法篇
- 我为什么要写LeetCode的博客?
- Use vimdiff as git mergetool
- MSP430实现简单的对临界资源的冲突访问
- My97DateTimePicker使用说明
- vim便捷命令:高亮搜索& 多行注释 和 取消多行注释
- R语言-结构控制
- UIWebView、WKWebView使用详解及性能分析
- I/O多路转接之poll,epoll
- 二十个热门的高级Java面试题汇总
- java中关于String类型和double,int类型之间的转换
- oj:深搜+回溯(3)
- 技巧:Vimdiff 使用
- ListView TableView ScrollView三者之Tableview
- 排序一 直接插入排序
- unix环境I/O多路复用
- Kafka学习笔记-Java简单操作