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;
}
/*
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;
}
相关文章推荐
- Street Race_usaco 4.3_spfa+暴力+dfs
- usaco Street Race
- 【20171005】Luogu P2752 [USACO4.3]街道赛跑Street Race——BFS的基础应用
- usaco 4.3 Street Race(搜索)
- Street Race[USACO]
- USACO 4.3 Street Race&The Primes(跪了)
- bzoj 4581: [Usaco2016 Open]Field Reduction (dfs)
- 【bzoj 4581】[Usaco2016 Open]Field Reduction(dfs)
- USACO 4.1 Cryptcowgraphy(DFS)
- 【COGS & USACO Training】710. 命名那个数字(hash+水题+dfs)
- 【BZOJ】1675: [Usaco2005 Feb]Rigging the Bovine Election 竞选划区(暴力dfs+set判重)
- dfs+dp——[Usaco2008 Mar]Cow Travelling游荡的奶牛
- USACO 1.5 Checker Challenge (DFS)
- [usaco]4.1.3 Fence Rails 多维背包问题,dfsid
- castle_usaco2.1.1_codevs3102_dfs
- USACO Wormholes 【DFS】
- BZOJ 1603: [Usaco2008 Oct]打谷机|dfs
- USACO : Party Lamps dfs 深搜
- USACO / The Castle (Floodfill+DFS)
- usaco 5.2 Wisconsin Squares(DFS)