题意:
找两点之间相同颜色连成的道路的条数。
分析:
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;
}
}
版权声明:本文为博主原创文章,未经博主允许不得转载。
时间: 2024-11-08 14:00:50