问题描述
试题编号: | 201509-4 |
试题名称: | 高速公路 |
时间限制: | 1.0s |
内存限制: | 256.0MB |
问题描述: | 问题描述 某国有n个城市,为了使得城市间的交通更便利,该国国王打算在城市之间修一些高速公路,由于经费限制,国王打算第一阶段先在部分城市之间修一些单向的高速公路。 输入格式 输入的第一行包含两个整数n, m,分别表示城市和单向高速公路的数量。 输出格式 输出一行,包含一个整数,表示便利城市对的数量。 样例输入 5 5 样例输出 3 样例说明
评测用例规模与约定 前30%的评测用例满足1 ≤ n ≤ 100, 1 ≤ m ≤ 1000; |
#include<iostream>
#include<cstdio>
#include<stdio.h>
#include<cstdlib>
#include<vector>
#include<stdlib.h>
#include<algorithm>
#include<string.h>
#include<cstring>
using namespace std;
const int maxn=10050;
int n,m,u,v;
vector<int> g[maxn];
vector<int> rg[maxn];
vector<int> vs;
vector<int> DAG[maxn];
bool used[maxn];
int cmp[maxn];
void addedge(int u,int v){
g[u].push_back(v);
rg[v].push_back(u);
}
void dfs(int v){
used[v]=true;
for(int i=0;i<g[v].size();i++)
if (!used[g[v][i]]) dfs(g[v][i]);
vs.push_back(v);
}
void rdfs(int v,int k){
used[v]=true;
DAG[k].push_back(v);
cmp[v]=k;
for(int i=0;i<rg[v].size();i++)
if (!used[rg[v][i]]) rdfs(rg[v][i],k);
}
int scc(){
memset(used,0,sizeof(used));
vs.clear();
for(int v=0;v<n;v++)
if (!used[v]) dfs(v);
memset(used,0,sizeof(used));
int k=0;
for(int i=vs.size()-1;i>=0;i--)
if (!used[vs[i]]) rdfs(vs[i],k++);
return k;
}
int main(){
//freopen("a.txt","r",stdin);
while(scanf("%d%d",&n,&m)!=EOF){
for(int i=0;i<=n;i++){
g[i].clear();
rg[i].clear();
}
memset(cmp,0,sizeof(cmp));
while(m--){
scanf("%d%d",&u,&v);
addedge(u-1,v-1);
}
int num=scc(),ans=0;
u=0,v=0;
for(int i=0;i<num;i++)
{
int cnt=DAG[i].size();
if(cnt>1)
{
u=i;
ans+=((cnt-1)*cnt/2);
}
}
printf("%d\n",ans);
}
return 0;
}