题目链接:Codeforces 645D Robot Rapping Results Report
题意:给定一个有向图,问是否唯一存在拓扑序列。若存在,输出一个最小的
k
使得前
思路:题目明确了一定有解,那么我们只需考虑有向图的最长链,当最长链包含
n
个节点就说明拓扑序列唯一。
设置
#include <iostream>
#include <cstdio>
#include <cstring>
#include <cstdlib>
#include <cmath>
#include <algorithm>
#include <vector>
#include <queue>
#include <map>
#include <stack>
#define PI acos(-1.0)
#define CLR(a, b) memset(a, (b), sizeof(a))
#define fi first
#define se second
#define ll o<<1
#define rr o<<1|1
using namespace std;
typedef long long LL;
typedef pair<int, int> pii;
const int MAXN = 1e5 + 10;
const int pN = 1e6;// <= 10^7
const int INF = 0x3f3f3f3f;
const int MOD = 1e9 + 7;
const int N = 1e7+10;
struct Edge {
int from, to, next;
};
Edge edge[MAXN];
int head[MAXN], edgenum;
void init() {CLR(head, -1); edgenum = 0;}
map<pii, int> fp;
void addEdge(int u, int v) {
Edge E = {u, v, head[u]};
edge[edgenum] = E;
head[u] = edgenum++;
}
int dp[MAXN], Max[MAXN];
int Count(int u) {
if(dp[u] != -1) return dp[u];
int ans = 1;
for(int i = head[u]; i != -1; i = edge[i].next) {
int v = edge[i].to;
if(Count(v) + 1 > ans) {
ans = Count(v) + 1;
Max[u] = max(Max[v], fp[pii(u, v)]);
}
}
dp[u] = ans;
return ans;
}
int main()
{
int n, m; cin >> n >> m;
init(); fp.clear();
for(int i = 1; i <= m; i++) {
int u, v;
cin >> u >> v;
fp[pii(u, v)] = i;
addEdge(u, v);
}
int ans = -1; CLR(dp, -1);
for(int i = 1; i <= n; i++) {
if(Count(i) == n) {
ans = Max[i];
break;
}
}
cout << ans << endl;
return 0;
}