传送门:http://www.lydsy.com/JudgeOnline/problem.php?id=1191
以锦囊作为节点,问题作为边“一步一步”构图,当一个时刻,某个联通块中边数>点数,则这个问题没有办法回答,输出答案退出程序。
#include <cstdio> #include <algorithm> const int maxn = 1005, maxm = 1005; int n, m, u, v, fu, fv, fa[maxn], nume[maxn], numv[maxn], ans; int getfa(int aa) { return aa == fa[aa]? aa: fa[aa] = getfa(fa[aa]); } int main(void) { //freopen("in.txt", "r", stdin); scanf("%d%d", &n, &m); for (int i = 0; i < n; ++i) { fa[i] = i; numv[i] = 1; } for (int i = 0; i < m; ++i) { scanf("%d%d", &u, &v); fu = getfa(u); fv = getfa(v); if (fu == fv) { ++nume[fu]; } else { numv[fu] += numv[fv]; nume[fu] = nume[fu] + nume[fv] + 1; fa[fv] = fu; } if (nume[fu] > numv[fu]) { printf("%d ", i); return 0; } } printf("%d ", m); return 0; }