码迷,mamicode.com
首页 > 其他好文 > 详细

崆若的水题之--全世界最水的邻接表二连发哈哈哈哈

时间:2015-05-13 19:40:40      阅读:114      评论:0      收藏:0      [点我收藏+]

标签:

 

 

有n个城市,编号为1到n,这些城市当中有m条有向边,现在Kong_Ruo在1号城市,他准备去旅游。如果Kong_Ruo能从城市1到达城市i,并能从城市i回到城市1,那么Kong_Ruo就能去城市i游览。现在请你从小到大输出所有能去游览的城市编号。

输入

第一行:两个整数n,m,分别表示城市个数与有向边个数。
后m行:每行两个整数a和b,表示a城市到b城市有一条有向边。 

输出

输出所有符合要求的城市编号,每个一行,从小到大输出。

输入示例

5 4
3 1
2 3
4 3
1 2

输出示例

1
2
3

技术分享
#include<iostream> 
using namespace std;
const int maxn=100010;
int first[maxn],next[maxn],u[maxn],v[maxn],e;
int refirst[maxn],renext[maxn],reu[maxn],rev[maxn],ree;
int vis[maxn],revis[maxn],q[maxn],req[maxn];
void bfs(int x)
{
    int front=0,rear=0;
    vis[x]=1;
    q[rear++]=x;
    while(front<rear)
    {
        x=q[front++];
        for(int i=first[x];i;i=next[i])
        {
            if(!vis[v[i]])
            {
                vis[v[i]]=1;
                q[rear++]=v[i];
            }
        }
    }
}
void rebfs(int x)
{
    int front=0,rear=0;
    revis[x]=1;
    req[rear++]=x;
    while(front<rear)
    {
        x=req[front++];
        for(int i=refirst[x];i;i=renext[i])
        {
            if(!revis[rev[i]])
            {
                revis[rev[i]]=1;
                req[rear++]=rev[i];
            }
        }
    }
}
void AddEdge(int a,int b)   
{
    u[++e]=a;
    v[e]=b;
    reu[e]=b;
    rev[e]=a;
    next[e]=first[a];   
    renext[e]=refirst[b];
    first[a]=e;
    refirst[b]=e;
}
int main()
{
    int n,m,a,b,ans=0;
    scanf("%d%d",&n,&m);
    for(int i=0;i<m;i++)
    {
        scanf("%d%d",&a,&b);
        AddEdge(a,b);
    }
    bfs(1);
    rebfs(1);
    for(int i=1;i<=n;i++)
        if(vis[i] && revis[i]) printf("%d\n",i);
    //system("pause");
}
哈哈哈哈这就是代码
试题描述

有n个城市,编号为1 ~ n,这些城市当中有一些有向边,现在Kong_Ruo从1号城市出发,请问他最多能到达多少城市呢?(一号城市也算)

输入
第一行:两个整数n,m,分别表示城市个数与有向边个数。
后m行:每行两个整数a和b,表示a城市到b城市有一条有向边。
输出
一个整数,表示Kong_Ruo最多能到达的城市数量。
输入示例
5 4
1 2
1 3
3 4
4 1
输出示例
4
其他说明
1<=n,m<=100000

 

技术分享
#include<iostream>//邻接表 
using namespace std;
const int maxn=100010;
int first[maxn],next[maxn],u[maxn],v[maxn],e;

int vis[maxn];

int q[maxn];

void bfs(int x)
{
    int front=0,rear=0;
    vis[x]=1;
    q[rear++]=x;
    while(front<rear)
    {
        x=q[front++];
        for(int i=first[x];i;i=next[i])
        {
            if(!vis[v[i]])
            {
                vis[v[i]]=1;
                q[rear++]=v[i];
            }
        }
    }
}

void AddEdge(int a,int b)   
{
    u[++e]=a;  //储存有向边的信息 
    v[e]=b;
    next[e]=first[a];   
    first[a]=e;
}

int main()
{
    int n,m,a,b,ans=0;
    scanf("%d%d",&n,&m);
    for(int i=0;i<m;i++)
    {
        scanf("%d%d",&a,&b);
        AddEdge(a,b);
    }
    bfs(1);
    for(int i=1;i<=n;i++) if(vis[i]) ans++;
    printf("%d",ans);
    return 0;
}
代码#2

崆若的水题之--全世界最水的邻接表二连发哈哈哈哈

标签:

原文地址:http://www.cnblogs.com/Kong-Ruo/p/4501248.html

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!