ACM的一道题,我用DFS(深度优先遍历)结果被判定时间过长,是我写错了还是DFS不适合
这是题目传送门:http://acm.csu.edu.cn/OnlineJudge/problem.php?id=1004
我的代码是:
#include <iostream>
using namespace std;
bool DFS(bool station,int posx,int posy,int end,bool column,int max);
int main()
{
int T; //0<T<30
int start,end; //
int n; //0<n<=50
cin>>T;
for (int i=0;i<T;i++)
{
int max=-1;
bool station={{false}}; //邻接矩阵
bool column={false}; //记录某列是否已经走过
cin>>start>>end>>n;
int temp,before;
while (1)
{
if ('\n' == cin.peek())
{
before=-1;
if (0 == n--) break;
}
cin>>temp;
if (temp > max) max=temp;
if (-1 == before) before=temp;
else if (temp == before) continue;
else station=station=true;
}
if (DFS(station,start,0,end,column,max)) cout<<"Yes"<<endl;
else cout<<"No"<<endl;
}
return 0;
}
bool DFS(bool station,int posx,int posy,int end,bool column,int max)
{
if (posy == end && true == station)
return true;
else if (posy > max)
return false;
if (true == station && false == column)
{
column=true;
if (DFS(station,posy,0,end,column,max)) return true;
column=false;
}
return DFS(station,posx,posy+1,end,column,max);
}系统说我执行时间超过了1s,是不是DFS在此不适用?:mad:
本帖最后由 rockerz 于 2014-4-18 11:31 编辑
这道题只给你1s的时间但给了你128mb的内存,明显是要你用内存来换时间。用并查表会快很多。union find disjoint set。
http://zh.wikipedia.org/zh-sg/%E5%B9%B6%E6%9F%A5%E9%9B%86
#include <cstdio>
#include <iostream>
using namespace std;
int rank;
int p;
void makeset(int x){
p=x;
rank=0;
}
int findp(int x){
if (p != x)p=findp(p);
return p;
}
void unionset(int x, int y){
int xp,yp;
xp=findp(x);
yp=findp(y);
if (xp==yp)return;
if (rank<rank)p=yp;
else if (rank>rank)p=xp;
else{ //if equal
p=xp;
rank++;
}
}
int main()
{
bool firstc=true;
int t,n,x,s,e,i=0;
int temp;
scanf ("%d",&t);
while (t--){
scanf("%d%d",&s,&e);
scanf("%d",&n);
while (n--){
if (firstc)scanf("%d",&temp); //skip first c
int x1;
while (1){
if (cin.peek()=='\n')break;
if (i!=0)x1=x;
scanf("%d",&x);
makeset(x);
if (i!=0){
unionset(x,x1);
}
i++;
}
firstc=true;
}
if (findp(s)==findp(e))printf("Yes\n");
else printf("No\n");
}
return 0;
}
你可以拿去试试,反正他给的Test case都过关了。还有就是你应该学会用cstdio中的scanf()和printf()。这两个比Cin和cout要快很多,有的时候他给的数据庞大了,时间差距就十分明显了。
rockerz 发表于 2014-4-18 10:54 static/image/common/back.gif
这道题只给你1s的时间但给了你128mb的内存,明显是要你用内存来换时间。用并查表会快很多。union find disj ...
你的也是Time Limit:titter: 这。。。我也不清楚了。。学艺不精啊。。
页:
[1]