题目链接 : poj2230
大致题意:
有一个人每晚要检查牛场,牛场内有m条路,他担心会有遗漏,就每条路检查两次,且每次的方向不同,要求你打印他行走的路径(必须从1开始),打印一条即可。
思路分析
输入n条边,要求每条边都要走两次,每次的方向不同。那么就可以看成是有向图,把一条边分成两条边,就可以直接打印结果。但是这题还有一个陷阱,m最大为50000,n最大为10000,如果直接采用邻接矩阵数组放不下,那么我的方法就是利用一个动态数组存储结构体。
struct node
{
int key; //记录边的另一头的值
int ok; //标记这条路是否走过
node(int x,int y);
};
vector<node>G[maxn]; //记录每条边的信息
这样做的优点在于,不可能每个节点都与其他节点连通,毕竟最多只有50000条边,即说明不可能每个G[i].size()都接近10000, 因此利用动态数组可以很好地节约内存。
强烈建议搞懂这里的动态数组的处理方法。
AC代码如下:
#include<cstdio>
#include<vector>
using namespace std;
const int maxn=10000+5;
struct node
{
int key;
int ok;
node(int x,int y);
};
node::node(int x,int y)
{
key=x; ok=y;
}
vector<node>G[maxn];
void dfs(int u)
{
int len=G[u].size();
for(int i=0;i<len;i++)
{
node &temp=G[u][i];
if(temp.ok)
{
temp.ok=0;
dfs(temp.key);
}
}
printf("%d\n",u);
}
int main()
{
int n,m;
int x,y;
scanf("%d%d",&n,&m);
for(int i=0;i<m;i++)
{
scanf("%d%d",&x,&y);
G[x].push_back(node(y,1));
G[y].push_back(node(x,1));
}
dfs(1);
return 0;
}
如有不当之处欢迎指出!!