usaco street race(dfs)

来源:互联网 发布:编程方法学 编辑:程序博客网 时间:2024/05/22 10:25

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

/*ID: jinbo wuTASK: race3LANG: 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[n][a]=1;    cin>>b;    while(b!=-2)    {    g[n][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;}


0 0