题目描述:
本题的主要问题是:
1、 输入的顶点数最大可能有1*10的4次方,如果用邻接矩阵表示,那么就要10000×10000大小的数组。明显是不行的。
最好还是要用邻接表(这里我用的是数组表示的邻接表)。
2、 很容易看出是求路径为2的路线有多少条,但是怎么判断是否合法?(合法:除了起始两个节点,其他的都不能相同,起始两个可以相同也可以不同)。
方法:dfs的每一次进行根据前面走过的判断,当前的节点A(前一个节点是C),其下一个节点B,不能和C相同。
代码:
#include<bits/stdc++.h>
using namespace std;
// int edgs[10001][10001]; //不太可能,这是第一个主要的问题
//要用邻接表表示(点&边)
//题目其实就是求路径为2的有几条(不管起始相同与否),但是要求中间的不能相同(尾部可以)
struct edge
{
int x, y;//始末两点
int next;
}edgs[20010];
int vexs[10005];//点表,值是由此点出发的第一条边
int vexNum = 0, edgNum = 0, ans = 0,tot = 0;
void Add(int x,int y)
{
int head = vexs[x];
tot++;
edgs[tot].x = x;
edgs[tot].y = y;
edgs[tot].next = head/*下一条边的下标*/;
vexs[x] = tot;
}
void dfs(int x/*当前的*/,int pre/*前一个*/,int num)
{
if(num == 3)
{
ans++;
return;
}
else
{
for (int i = vexs[x]; i ;i = edgs[i].next)
{
int next = edgs[i].y;
//i为下一个边的下标
if(next!=pre)
{
dfs(next,x,num+1);
}
}
}
}
int main()
{
int x, y,i;
scanf("%d %d",&vexNum,&edgNum);
// vexNum = 5,edgNum = 6;
for (int i = 1; i <= edgNum;i++)
{
scanf("%d%d",&x,&y);
Add(x,y);
Add(y,x);
}
for (int i = 1; i <= vexNum; i++)
{
dfs(i,0,0);
}
printf("%d",ans);
return 0;
}