医院
题目大意:
有n个城市,有m条线路使他们相连(有向), 在一些城市中建立医院,相连的城市只能有一间医院,每个医院可以派医生去别的城市,当医生走的线路>=3时,他们会十分生气,请在他们不生气的前提下建立医院使每个城市都可以有医生(输出0换行 医院数 换行 每个医院所在城市)
样例输入
4 3
2 1
4 3
3 2
10
样例输出
0
2
2 4
数据范围限制
1<=N<=100,0<=M<=10000。
解题思路
用两个数组存来来此点的线和从此点出发的线,然后判断入度为0的点建医院然后枚举每个点,他的距离等于周围距离最小的+1,再判断是否小于3,如果不小于3就建医院
这个方法虽然在OJ上A了,但存在反例
反例:
5 4
5 4
4 3
3 2
2 1
0
#include<cstdio>
#include<iostream>
#include<algorithm>
#include<cstring>
using namespace std;
int w,x,y,n,m,ans,l[105],s[105],head[105],ls[105],p[105];
struct rec
{int to,next;
}f[10005];
struct recc
{int from,nextt;
}b[10005];
int main()
{freopen("d.in","r",stdin);freopen("d.out","w",stdout);memset(l,127/3,sizeof(l));scanf("%d %d",&n,&m);for (int i=1;i<=m;++i){scanf("%d %d",&x,&y);f[i].to=y;//去f[i].next=head[x];head[x]=i;p[y]=1;//入度b[i].from=x;//来b[i].nextt=ls[y];ls[y]=i;}for (int i=1;i<=n;i++)if (!p[i])//是否有入度{l[i]=0;//距离++ans;//结果s[i]=1;//记录for (int j=head[i];j;j=f[j].next)l[f[j].to]=1;//距离}for (int i=1;i<=n;i++)if(l[i]==l[0])//没变过{for (int j=ls[i];j;j=b[j].nextt)l[i]=min(l[b[j].from],l[i]);//周围的数if (l[i]>=3)//生气了{l[i]=0;//距离s[i]=1;//记录ans++;//结果}} printf("0\n%d\n",ans);//输出for (int i=1;i<=n;i++)if (s[i]) printf("%d ",i);fclose(stdin);fclose(stdout);return 0;
}