时间限制: | 1.0s |
内存限制: | 256.0MB |
问题描述: | 问题描述 某国有n个城市,为了使得城市间的交通更便利,该国国王打算在城市之间修一些高速公路,由于经费限制,国王打算第一阶段先在部分城市之间修一些单向的高速公路。 输入格式 输入的第一行包含两个整数n, m,分别表示城市和单向高速公路的数量。 输出格式 输出一行,包含一个整数,表示便利城市对的数量。 样例输入 5 5 样例输出 3 样例说明
评测用例规模与约定 前30%的评测用例满足1 ≤ n ≤ 100, 1 ≤ m ≤ 1000; |
强连通分量和一点选择组合的思想,python的板子可能有问题,60分。。。C++100分
def tarjan(u):
global cnt,dfn,low,belong,scnt,stack
cnt+=1
dfn[u]=low[u]=cnt
stack.append(u)
for i in range(len(graph[u])):
v=graph[u][i]
if dfn[v]==0:
tarjan(v)
low[u]=min(low[u],low[v])
elif belong[v]==0:
low[u]=min(low[u],dfn[v])
if dfn[u]==low[u]:
scnt+=1
while True:
x=stack[len(stack)-1]
stack.pop(-1)
#print(x)
belong[x]=scnt
if x==u:
break
while True:
try:
stack = []
sum = [0 for _ in range(10005)]
low = [0 for _ in range(10005)]
belong = [0 for _ in range(10005)]
dfn = [0 for _ in range(10005)]
graph = [[] for _ in range(10005)]
n,m = map(int,input().split())
for i in range(m):
u,v = map(int,input().split())
graph[u].append(v)
cnt=scnt=0
for i in range(1,n+1):
if dfn[i]==0:
tarjan(i)
# for i in range(1,n+1):
# print(belong[i])
for i in range(1,n+1):
sum[belong[i]]=sum[belong[i]]+1
# for i in range(1,n+1):
# print(sum[i])
ans=0
for i in range(1,scnt+1):
ans+=((sum[i]-1)*sum[i])//2
print(ans)
except:
break