高速公路

试题编号: 201509-4
试题名称: 高速公路
时间限制: 1.0s
内存限制: 256.0MB
问题描述:
问题描述

  某国有n个城市,为了使得城市间的交通更便利,该国国王打算在城市之间修一些高速公路,由于经费限制,国王打算第一阶段先在部分城市之间修一些单向的高速公路。
  现在,大臣们帮国王拟了一个修高速公路的计划。看了计划后,国王发现,有些城市之间可以通过高速公路直接(不经过其他城市)或间接(经过一个或多个其他城市)到达,而有的却不能。如果城市A可以通过高速公路到达城市B,而且城市B也可以通过高速公路到达城市A,则这两个城市被称为便利城市对。
  国王想知道,在大臣们给他的计划中,有多少个便利城市对。

输入格式

  输入的第一行包含两个整数n, m,分别表示城市和单向高速公路的数量。
  接下来m行,每行两个整数a, b,表示城市a有一条单向的高速公路连向城市b。

输出格式

  输出一行,包含一个整数,表示便利城市对的数量。

样例输入

5 5
1 2
2 3
3 4
4 2
3 5

样例输出

3

样例说明


  城市间的连接如图所示。有3个便利城市对,它们分别是(2, 3), (2, 4), (3, 4),请注意(2, 3)和(3, 2)看成同一个便利城市对。

评测用例规模与约定

  前30%的评测用例满足1 ≤ n ≤ 100, 1 ≤ m ≤ 1000;
  前60%的评测用例满足1 ≤ n ≤ 1000, 1 ≤ m ≤ 10000;
  所有评测用例满足1 ≤ n ≤ 10000, 1 ≤ m ≤ 100000。

分析:

本题考察的是求有向图中强连通分量的应用,该题采用的是tarjan算法,关于tarjan算法可以阅读tarjan算法-解决有向图中求强连通分量的利器这篇文章。

不多说,上代码:

#include "Stdafx.h"
#include <iostream>
#include <stack>
using namespace std;

#define MAX_VERTEX_SIZE 10001
struct EdgeNode{
    int vertex;
    EdgeNode *nextArc;
};

struct VerTexNode{
    EdgeNode* firstArc;
};

struct Graph{
    int n,e;
    VerTexNode vNode[MAX_VERTEX_SIZE];
};

int time = 0;
int low[MAX_VERTEX_SIZE];
int dfn[MAX_VERTEX_SIZE];
int visited[MAX_VERTEX_SIZE];
int inStack[MAX_VERTEX_SIZE];
int ans = 0;//存储运算结果
stack<int> st;
Graph graph;

void initeGraph(int n,int m)
{
    for(int i = 1;i<=n;i++)
    {
        graph.vNode[i].firstArc = NULL;
    }
    graph.n = n;
    graph.e = m;

}

//头插法建立图
void creatGraph(int s,int v)
{
    EdgeNode *edgeNode = new EdgeNode;
    edgeNode->vertex = v;
    edgeNode->nextArc = graph.vNode[s].firstArc;
    graph.vNode[s].firstArc = edgeNode;
}    

int min(int a,int b)
{
    if(a>b)
        return b;
    else
        return a;
}

void trajan(int u)
{
    dfn[u] = low[u] = time++;
    st.push(u);
    visited[u] = 1;
    inStack[u] = 1;
    EdgeNode *edgePtr = graph.vNode[u].firstArc;
    while(edgePtr !=NULL)
    {
        int v = edgePtr->vertex;
        if(visited[v] == 0)
        {
            trajan(v);
            low[u] = min(low[u],low[v]);
        }
        /*之前没有对inStack[v]进行判断,又可能当前的v已经出栈了,这个时候就会出错。
        所以导致我的最后得分为80分。
        加上if条件,最后为满分。
        切记!切记!切记!!!
        */

        else if(inStack[v] == 1)
        {
            low[u] = min(low[u],dfn[v]);
        }
        edgePtr = edgePtr->nextArc;
    }

    int result = 0;
    if(dfn[u] == low[u])
    {
        int vtx;
        //cout<<"set is: ";
        do{
            result++;
            vtx = st.top();
            st.pop();
            inStack[vtx] = 0;//表示已经出栈
        /*    cout<<vtx<<‘ ‘;*/
        }while(vtx !=u );
        if(result > 1)
        {
            ans += result*(result-1)/2;
        }
        result = 0;
    }

}

int main()
{
    int n,m;
    int s,a;
    cin>>n>>m;
    initeGraph(n,m);
    for(int i = 1;i<=n;i++)
    {
        visited[i] = 0;
        inStack[i] = 0;
        dfn[i] = 0;
        low[i] = 0;
    }

    for(int j = 1;j<=m;j++)
    {
        cin>>s>>a;
        creatGraph(s,a);
    }

    for(int i =1;i<=n;i++)
        if(visited[i] == 0)
            trajan(i);
    cout<<ans<<endl;
    return 0;
}

时间: 2024-12-19 07:37:51

高速公路的相关文章

CCF试题:高速公路(Targin)

问题描述 某国有n个城市,为了使得城市间的交通更便利,该国国王打算在城市之间修一些高速公路,由于经费限制,国王打算第一阶段先在部分城市之间修一些单向的高速公路. 现在,大臣们帮国王拟了一个修高速公路的计划.看了计划后,国王发现,有些城市之间可以通过高速公路直接(不经过其他城市)或间接(经过一个或多个其他城市)到达,而有的却不能.如果城市A可以通过高速公路到达城市B,而且城市B也可以通过高速公路到达城市A,则这两个城市被称为便利城市对. 国王想知道,在大臣们给他的计划中,有多少个便利城市对. 输入

安康5月28日将举办汉江龙舟节暨西康高速公路通车典礼(欢乐中国行-魅力安康,中央三套6月7日首播)

第九届中国安康汉江龙舟节,将于2009年5月28日至30日,在安康隆重举行. 今年举办的第九届中国安康汉江“泸康杯”龙舟节,将把龙舟节开幕式与西康高速公路通车典礼成功对接,央视著名栏目“欢乐中国行—魅力安康”,将尽情展示绿色安康的无限魅力. 欢乐中国行—魅力安康的具体播出时间是:中央三套6月7日晚7点30分. http://space.tv.cctv.com/podcast/huanlezhongguoxing 据悉,西康高速通车后,西安到安康仅需要2-3小时.目前,安康还是陕西唯一一个没有高速

CCF 高速公路 tarjan求强连通分量

问题描述 某国有n个城市,为了使得城市间的交通更便利,该国国王打算在城市之间修一些高速公路,由于经费限制,国王打算第一阶段先在部分城市之间修一些单向的高速公路. 现在,大臣们帮国王拟了一个修高速公路的计划.看了计划后,国王发现,有些城市之间可以通过高速公路直接(不经过其他城市)或间接(经过一个或多个其他城市)到达,而有的却不能.如果城市A可以通过高速公路到达城市B,而且城市B也可以通过高速公路到达城市A,则这两个城市被称为便利城市对. 国王想知道,在大臣们给他的计划中,有多少个便利城市对. 输入

bzoj 2752: [HAOI2012]高速公路(road)

Description Y901高速公路是一条重要的交通纽带,政府部门建设初期的投入以及使用期间的养护费用都不低,因此政府在这条高速公路上设立了许多收费站.Y901高速公路是一条由N-1段路以及N个收费站组成的东西向的链,我们按照由西向东的顺序将收费站依次编号为1~N,从收费站i行驶到i+1(或从i+1行驶到i)需要收取Vi的费用.高速路刚建成时所有的路段都是免费的.政府部门根据实际情况,会不定期地对连续路段的收费标准进行调整,根据政策涨价或降价.无聊的小A同学总喜欢研究一些稀奇古怪的问题,他开

【BZOJ2752】[HAOI2012]高速公路(road) 线段树

[BZOJ2752][HAOI2012]高速公路(road) Description Y901高速公路是一条重要的交通纽带,政府部门建设初期的投入以及使用期间的养护费用都不低,因此政府在这条高速公路上设立了许多收费站.Y901高速公路是一条由N-1段路以及N个收费站组成的东西向的链,我们按照由西向东的顺序将收费站依次编号为1~N,从收费站i行驶到i+1(或从i+1行驶到i)需要收取Vi的费用.高速路刚建成时所有的路段都是免费的.政府部门根据实际情况,会不定期地对连续路段的收费标准进行调整,根据政

BZOJ2752: [HAOI2012]高速公路(road)

2752: [HAOI2012]高速公路(road) Time Limit: 20 Sec  Memory Limit: 128 MBSubmit: 608  Solved: 199[Submit][Status] Description Y901高速公路是一条重要的交通纽带,政府部门建设初期的投入以及使用期间的养护费用都不低,因此政府在这条高速公路上设立了许多收费站. Y901高速公路是一条由N-1段路以及N个收费站组成的东西向的链,我们按照由西向东的顺序将收费站依次编号为1~N,从收费站i行

基于数据仓库星形模式的广东省高速公路一张网资金结算情况分析系统

基于数据仓库星形模式的广东省高速公路一张网资金结算情况分析系统 马根峰                               (广东联合电子服务股份有限公司  广州 510300) 摘要    星形模式是基于关系数据库的数据仓库中的一个著名概念,由于星形连接模式的设计思想能够满足人们从不同观察角度(维)分析数据的需求,所以在基于关系数据库的数据仓库的设计中广泛地使用了星形模式.本文主要介绍<广东省高速公路一张网资金结算情况分析系统>中的数据仓库技术. 关键词    数据仓库:星形模式:维

[HAOI2012]高速公路

题目描述 Y901高速公路是一条重要的交通纽带,政府部门建设初期的投入以及使用期间的养护费用都不低,因此政府在这条高速公路上设立了许多收费站. Y901高速公路是一条由N-1段路以及N个收费站组成的东西向的链,我们按照由西向东的顺序将收费站依次编号为1~N,从收费站i行驶到i+1(或从i+1行驶到i)需要收取Vi的费用.高速路刚建成时所有的路段都是免费的. 政府部门根据实际情况,会不定期地对连续路段的收费标准进行调整,根据政策涨价或降价. 无聊的小A同学总喜欢研究一些稀奇古怪的问题,他开车在这条

根据排队论阐述路由器和高速公路的拥堵以及拥堵缓解问题

关于本文 相信很多人都在节假日的高速公路上遇到过大拥堵,但是最终拥堵会解除.也有人在质疑路由器队列的长度,以为最终路由器会拒绝服务.我曾经在10年前天真地以为高速公路的设计者和路由器交换机的设计者工作是多么的轻松.然而现在,当我知道更多后,发现事实并不如此.需要更多的权衡和博弈,不仅仅是技术方面的,还涉及到了心理学,社会学,经济学.       因此本文旨在用最简单的描述分析一下排队理论对高速公路以及分组交换网络的指导.文中没有复杂的数学推导,这种推导请自行完成,或者请背诵大学概率论教科书的相关