您的位置:首页 > 其它

usaco street race(dfs)

2017-01-28 20:23 357 查看
一开始我觉得很麻烦但第一题好做由于数据较小直接每个点删后dfs就可以了,第二问我不知道如何判断有没有公共的道路,最后看别人的也挺简单的就是看分别从两条公路的起点开始dfs如果他们能到达同一点就代表有公共道路。那就好做了。

/*
ID: jinbo wu
TASK: race3
LANG: C++
*/
#include<bits/stdc++.h>
using namespace std;
int g[55][55];
bool vis[55];
bool vis1[55];
int num1[55];
int num2[55];
int flag;
int n;
void dfs(int m)
{
vis[m]=1;
for(int i=0;i<n;i++)
{
if(g[m][i]&&!vis[i])
dfs(i);
}
}
void dfs1(int m)
{
if(vis[m]==1)
{
flag=0;
return ;
}
vis1[m]=1;
for(int i=0;i<n;i++)
{
if(!vis1[i]&&g[m][i])
dfs1(i);
}
}
int main()
{
freopen("race3.in","r",stdin);
freopen("race3.out","w",stdout);
int a,b;
n=-1;
cin>>a;
while(a!=-1)
{
n++;
if(a==-2)
{
cin>>a;
continue;
}
g
[a]=1;
cin>>b;
while(b!=-2)
{
g
[b]=1;
cin>>b;
}
cin>>a;
}
n++;
int l1=0,l2=0;
for(int i=1;i<n-1;i++)
{
memset(vis,0,sizeof(vis));
vis[i]=1;
dfs(0);
if(!vis[n-1])
num1[l1++]=i;
}
for(int i=0;i<l1;i++)
{
flag=1;
memset(vis,0,sizeof(vis));
memset(vis1,0,sizeof(vis1));
vis[num1[i]]=1;
dfs(0);
vis[num1[i]]=0;
dfs1(num1[i]);
if(flag)
num2[l2++]=num1[i];
}
cout<<l1;
for(int i=0;i<l1;i++)
cout<<" "<<num1[i];
cout<<endl;
cout<<l2;
for(int i=0;i<l2;i++)
cout<<" "<<num2[i];
cout<<endl;
}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: