#include<iostream> #include<vector> usingnamespacestd; structnode { int v, w; }; vector<node> G[11]; voidinsert1(int u, int v, int w){ node temp; temp.v = v; temp.w = w; G[u].push_back(temp); } voidinsert2(int u, int v, int w){ insert1(u, v, w); insert1(v, u, w); } voidinput(){ int m; cin >> m; for (int i = 0; i < m; i++) { int u, v, w; cin >> u >> v >> w; insert2(u, v, w); } }
voidoutput(){ for (int i = 1; i <= 10; i++) { for (int j = 0; j < G[i].size(); j++) { cout << "(" << i << ", " << G[i][j].v << ", " << G[i][j].w << ")" << endl; } } } intmain(){ input(); output(); return0; }
constint N = 1000000; constint M = 10000; structedge { int v, w; int next; //其实这里的next指向前驱 edge() {} edge(int _v, int _w, int _next): v(_v), w(_w), next(_next) {} } e[M];
int head[N]; //head[i] 表示从点 i int cnt; //记录边的数量,来作为边的索引
// 插入单向边 voidinsert(int u, int v, int w){ e[cnt] = edge(v, w, head[u]); //新建一个终点为 v, 权值为 w 的边,插入到表示 u 的链表尾部 head[u] = cnt; //将点 u 的 head指针移向后移一位,即刚刚插入的那个节点 cnt++; }
// 插入双向边 voidinsert2(int u, int v, int w){ insert(u, v, w); insert(v, u, w); }
// 输出整张图中的所有边: !注意:输出的顺序和插入的顺序是相反的 voidoutput(int n){ for (int i = 0; i < n; i++) { cout << i << " : "; for (int j = head[i]; ~j; j = e[j].next) { // 遍历从 i 连出的所有边 cout << "-> <[" << e[j].v << "]," << e[j].w << ">"; } cout << endl; } }
练习
关系查询
输入 n 对朋友关系,朋友关系是相互的。a 是 b 的朋友,b 也是 a 的朋友。(无向图) 然后有 m 次查询,每次查询询问 a 和 b 是否是朋友。 输入格式 第一行输入一个整数 n*(1≤n≤100)。 接下来 n 行,每行输入两个名字,表示一对朋友关系。 接下来一行输入一个整数 m(1≤m*≤100),表示 m 个查询。 接下来 m 行,每行输入两个名字,表示一次查询。 输入中的名字只包含大小写字母,长度不超过 20。 输出格式 对于每次查询,如果他们是朋友,输出一行"Yes",否则输出一行"No"。 样例输入
1 2 3 4 5 6 7 8 9 10
5 Mary Tom Islands Barty Andy Amy Islands Amy Tom Mary 3 Amy Andy Islands Tom Islands Barty
intmain(){ int n, m; ids = 0; cin >> n; while (n--) { string a, b; cin >> a >> b; int x = getId(a); int y = getId(b); G[x][y] = true; G[y][x] = true; } cin >> m; while (m--) { string a, b; cin >> a >> b; int x = getId(a); int y = getId(b); if (G[x][y]) { cout << "Yes" << endl; } else { cout << "No" << endl; } } }
voidswap(int &a, int &b){ int tmp; tmp = a; a = b; b = tmp; }
intmain(){ int n, m; cin >> n >> m; while (m--) { int u, v; cin >> u >> v; if (u > v) { swap(u, v); } st.insert(make_pair(u, v)); } if (st.size() == n * (n - 1) / 2) { cout << "Yes" << endl; } else { cout << "No" << endl; } return0; }