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

[搜索]CodeForces505B

时间:2015-08-29 11:15:10      阅读:153      评论:0      收藏:0      [点我收藏+]

标签:codeforces   搜索   

题意:
找两点之间相同颜色连成的道路的条数。
分析:
BFS+模拟

#include <cstdio>
#include <cstring>
#include <cmath>
#include <iostream>
#include <vector>
#include <map>
#include <set>
#include <utility> 
#include <stack>
#include <queue>
#include <algorithm>
#define read freopen("q.in","r",stdin)
#define write freopen("output.txt","w",stdout)
#define LL long long
const int inf = 0x7fffffff;
const int maxn = 5005;
const int mod = 1000000007;
using namespace std;
struct Node
{
    int to,c,next;
}node[maxn];
int head[maxn],vis[maxn];
int cnt,res,n,m;
void add(int u,int v,int c)
{
    node[cnt].to=v;
    node[cnt].c=c;
    node[cnt].next=head[u];
    head[u]=cnt++;

    node[cnt].to=u;
    node[cnt].c=c;
    node[cnt].next=head[v];
    head[v]=cnt++;
}

void bfs(int u,int v)
{
    int i,j;
    memset(vis,0,sizeof(vis));
    queue<int> q;
    map<int,int> mp;
    for(i=head[u];i!=-1;i=node[i].next)
    {
        q.push(i);
        vis[i]=1;
        vis[i^1]=1;
    //  cout<<"first push:"<<i<<endl;
    }
    while(!q.empty())
    {
        int t=q.front();q.pop();
        if(node[t].to==v && !mp[node[t].c])
        {
        //  cout<<"res edge:  "<<t<<"  res color: "<<node[t].c<<endl;
            res++;
            mp[node[t].c]=1;
            continue;
        }
        for(i=head[node[t].to];i!=-1;i=node[i].next)
        {
            if(node[i].c==node[t].c && !vis[i])
            {
        //      cout<<"push :"<<i<<endl;
                q.push(i);
                vis[i]=1;
                vis[i^1]=1;
            }
        }

    }

}
int main()
{
//  read;
    int i,j;
    while(~scanf("%d%d",&n,&m))
    {
        int a,b,c,q;
        cnt=0;
        memset(head,-1,sizeof(head));
        for(i=0;i<m;i++)
        {
            scanf("%d%d%d",&a,&b,&c);
            add(a,b,c);
        }
    //  for(i=0;i<cnt;i++)cout<<i<<": "<<head[i]<<endl;
        scanf("%d",&q);
        while(q--)
        {
            res=0;
            scanf("%d%d",&a,&b);
            bfs(a,b);
            cout<<res<<endl;
        }
    //  cout<<"-----------------------------"<<endl;
    }
} 

版权声明:本文为博主原创文章,未经博主允许不得转载。

[搜索]CodeForces505B

标签:codeforces   搜索   

原文地址:http://blog.csdn.net/u010582475/article/details/48084979

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