不是我的代码,而是从这里开始。在 read_data() 函数中有一个扫描,后面有一些我以前从未见过的东西。它有什么作用?是STL吗?
scanf("%d %dn", &a, &b), G[a].pb(b), deg[b]++;
这是逗号运算符的用法。逗号运算符(使用得相当罕见)将一堆表达式作为单个表达式组合在一起。在这种情况下,语句
scanf("%d %dn", &a, &b), G[a].pb(b), deg[b]++;
意思是"做scanf
,然后在G[a]
上调用pb(b)
,然后调用deg[b]++
,评估结果deg[b]++
。
我看到它用于以下上下文:
for(i = 1; i <= M; i++)
scanf("%d %dn", &a, &b), G[a].pb(b), deg[b]++;
老实说,这让我觉得风格很差。最好这样写:
for(i = 1; i <= M; i++) {
scanf("%d %dn", &a, &b);
G[a].pb(b);
deg[b]++;
}
上面的代码在功能上是等效的,并且更具可读性 - 您不必发布到Stack Overflow或了解C++语言的奇怪细节来弄清楚它的含义。
它只是使用逗号运算符将多个表达式组成一个语句。它有助于避免for
循环周围的大括号(在我看来这不是一个好主意,因为它会混淆代码)。
它在功能上等效于:
for(i = 1; i <= M; i++) {
scanf("%d %dn", &a, &b);
G[a].push_back(b); /* after macro expansion */
deg[b]++;
}