有歧义的号码
#include<stdio.h> #include<string.h> #include<stdlib.h> int cmp(const void * x, const void * y) { //x < y return (*((int *)(x))) > (*((int *)(y))) ? 1 : -1; } int a[10], b[10]; const int r[10] = { 0, 1, 2, -1, -1, 5, 9, -1, 8, 6 }; int main(){ #ifndef ONLINE_JUDGE freopen("input.txt", "r", stdin); #endif int n, d, x, y; scanf("%d", &n); for (int i = 1; i <= n; i++){ x = i, d = 0; if (x % 10 == 0) continue; bool flag = true; while (x){ a[d++] = x % 10; x /= 10; } for (int j = 0; j < d; j++){ b[j] = r[a[d - j - 1]]; if (b[j] == -1) flag = false; } y = 0; for (int j = d - 1; j >= 0; j--){ y = y * 10 + b[j]; } if (y>n || y == i) flag = false; if (flag) printf("%d ", i); } return 0; }
最短游览路线
算以1为源点的单源最短路,选择能走到1点的点中路径最短的一条加一输出。
没考虑-1的情况,也过了。
#include<stdio.h> #include<string.h> #include<stdlib.h> int cmp(const void * x, const void * y) { //x < y return (*((int *)(x))) > (*((int *)(y))) ? 1 : -1; } #include <vector> #include <queue> using namespace std; vector<int> G[10005]; queue<int> q; bool inq[10005], v[10005]; int d[10005]; int main(){ #ifndef ONLINE_JUDGE freopen("input.txt", "r", stdin); #endif int n, m, a, b, ans; scanf("%d%d", &n, &m); for (int i = 1; i <= n; i++){ G[i].clear(); d[i] = 0x3FFFFFFF; } d[1] = 0; memset(v, false, sizeof(v)); for (int i = 0; i < m; i++){ scanf("%d%d", &a, &b); G[a].push_back(b); if (b == 1) v[a] = true; } memset(inq, false, sizeof(inq)); while (!q.empty()) q.pop(); q.push(1); inq[1] = true; while (!q.empty()){ int x = q.front(); q.pop(); inq[x] = false; for (int i = 0; i < G[x].size(); i++){ int u = G[x][i]; if (d[u]>d[x] + 1){ d[u] = d[x] + 1; if (!inq[u]){ inq[u] = true; q.push(u); } } } } ans = 0x3FFFFFFF; for (int i = 1; i <= n; i++){ if (v[i] && d[i] < ans) ans = d[i]; } printf("%d ", ans + 1); return 0; }
重复字符串匹配
缩写命名
二分图匹配,字典中的单词是一个点集,S中的各个字母是一个点集,若最大匹配为|S|输出Yes,否则输出No。
#include<stdio.h> #include<string.h> #include<stdlib.h> int cmp(const void * x, const void * y) { //x < y return (*((double *)(x))) > (*((double *)(y))) ? 1 : -1; } class MaxFlow_SAP { public: #define SAP_MAXN 20010 #define SAP_MAXM 880010 #define SAP_INF 0x3FFFFFFF struct Node { int from, to, next; int cap; } edge[SAP_MAXM]; int tol; int head[SAP_MAXN]; int dep[SAP_MAXN]; int gap[SAP_MAXN]; int cur[SAP_MAXN]; int S[SAP_MAXN]; int que[SAP_MAXN]; int n; MaxFlow_SAP() { clear(); } void clear() { tol = 0; memset(head, -1, sizeof(head)); } void addedge(int u, int v, int w) { edge[tol].from = u; edge[tol].to = v; edge[tol].cap = w; edge[tol].next = head[u]; head[u] = tol++; edge[tol].from = v; edge[tol].to = u; edge[tol].cap = 0; edge[tol].next = head[v]; head[v] = tol++; } void BFS(int start, int end) { memset(dep, -1, sizeof(dep)); memset(gap, 0, sizeof(gap)); gap[0] = 1; int front, rear; front = rear = 0; dep[end] = 0; que[rear++] = end; while (front != rear) { int u = que[front++]; if (front == SAP_MAXN) { front = 0; } for (int i = head[u]; i != -1; i = edge[i].next) { int v = edge[i].to; if (dep[v] != -1) { continue; } que[rear++] = v; if (rear == SAP_MAXN) { rear = 0; } dep[v] = dep[u] + 1; ++gap[dep[v]]; } } } int SAP(int start, int end) { int res = 0; BFS(start, end); int top = 0; memcpy(cur, head, sizeof(head)); int u = start; int i; while (dep[start] < n) { if (u == end) { int temp = SAP_INF; int inser; for (i = 0; i < top; i++) if (temp > edge[S[i]].cap) { temp = edge[S[i]].cap; inser = i; } for (i = 0; i < top; i++) { edge[S[i]].cap -= temp; edge[S[i] ^ 1].cap += temp; } res += temp; top = inser; u = edge[S[top]].from; } if (u != end && gap[dep[u] - 1] == 0) { break; } for (i = cur[u]; i != -1; i = edge[i].next) if (edge[i].cap != 0 && dep[u] == dep[edge[i].to] + 1) { break; } if (i != -1) { cur[u] = i; S[top++] = i; u = edge[i].to; } else { int min = n; for (i = head[u]; i != -1; i = edge[i].next) { if (edge[i].cap == 0) { continue; } if (min > dep[edge[i].to]) { min = dep[edge[i].to]; cur[u] = i; } } --gap[dep[u]]; dep[u] = min + 1; ++gap[dep[u]]; if (u != start) { u = edge[S[--top]].from; } } } return res; } }; char str[105], dict[105][105]; MaxFlow_SAP sap; int main() { #ifndef ONLINE_JUDGE freopen("input.txt", "r", stdin); #endif int n, s, t; scanf("%d", &t); while (t--) { scanf("%d", &n); scanf("%s", str); s = strlen(str); for (int i = 0; i < n; i++) { scanf("%s", dict[i]); } sap.clear(), sap.n = n + s + 2; for (int i = 2; i <= n + 1; i++) { sap.addedge(1, i, 1); } for (int i = n + 2; i <= n + s + 1; i++) { sap.addedge(i, n + s + 2, 1); } for (int i = 0; i < n; i++) { int m = strlen(dict[i]); for (int j = 0; j < m; j++) { for (int k = 0; k < s; k++) { if (dict[i][j] == str[k]) { sap.addedge(i + 2, n + k + 2, 1); } } } } int maxflow = sap.SAP(1, n + s + 2); if (maxflow == s) printf("Yes "); else printf("No "); //1 2~n+1 n+2~n+s+1 n+s+2 } return 0; }