欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页

洛谷:P2853 [USACO06DEC]Cow Picnic S(图,普及/提高-,)

程序员文章站 2024-01-07 20:22:22
...

题目:

洛谷:P2853 [USACO06DEC]Cow Picnic S(图,普及/提高-,)

分析:

而且不存在起点和终点相同的有向路:意思是不存在环?对。

那就太简单了吧,hhh。

就是一个稍加修改的拓扑排序+dp。

直接转移,这样的情况会有重复:

洛谷:P2853 [USACO06DEC]Cow Picnic S(图,普及/提高-,)

改为出队列时,统计个数。

代码:为什么有问题呢?

#include<bits/stdc++.h>
using namespace std;
int A[1050];//哪些位置上有牛
int cnt[1050];
int m1,m2,m3;
vector<vector<int> > vv;
int D[1050];
int xx;
int cc=0;
void f()
{
 queue<int> q;
 for(int i=1;i<=m2;i++)
 {
  if(cnt[i]==0) 
  {
   q.push(i);
  }
 }
 while(!q.empty())
 {
  int c=q.front();
  q.pop();
  if(A[c]==1) cc++;
  if(cc==m1)
  {
   xx=c;return;
  }
  for(int i=0;i<vv[c].size();i++)
  {
   //点为 : vv[c][i] 
   cnt[vv[c][i]]--; 
   D[vv[c][i]]=max(D[vv[c][i]],D[c]);
   if(cnt[vv[c][i]]==0) q.push(vv[c][i]);
  }
 }
}
int dfs(int x)
{
 if(A[x]==1) return 0;
 A[x]=1;
 int sum=1;
 for(int i=0;i<vv[x].size();i++)
 {
  sum+=dfs(vv[x][i]);
 }
 return sum;
}
int main()
{
 cin>>m1>>m2>>m3;
 memset(A,0,sizeof(A));//1有  0无
 memset(cnt,0,sizeof(cnt));
 memset(D,0,sizeof(D));
 vector<int> v;
 for(int i=0;i<=m2;i++) vv.push_back(v);
 for(int i=0;i<m1;i++)
 {
  int c;
  cin>>c;
  A[c]=1;
 }
 for(int i=0;i<m3;i++)
 {
  int a,b;
  cin>>a>>b;
  cnt[b]++;
  vv[a].push_back(b);
 }
 f();
 memset(A,0,sizeof(A));
 cout<<dfs(xx);
 } 

看题解:每个牛进行一个dfs,然后统计个数即可。。。。很不错的思路。啊啊啊!!!

还没我的高效呢!

代码:很好写,我哭了。

#include<bits/stdc++.h>
using namespace std;
int A[1050];//哪些位置上有牛
int cnt[1050];
int m1,m2,m3;
vector<vector<int> > vv;
int D[1050];
void dfs(int x)
{
 if(A[x]==1) return;
 D[x]++;
 A[x]=1;
 for(int i=0;i<vv[x].size();i++)
 {
  dfs(vv[x][i]);
 }
}
int main()
{
 cin>>m1>>m2>>m3;
 memset(A,0,sizeof(A));//1有  0无
 memset(cnt,0,sizeof(cnt));
 memset(D,0,sizeof(D));
 vector<int> v;
 for(int i=0;i<=m2;i++) vv.push_back(v);
 for(int i=0;i<m1;i++)
 {
  int c;
  cin>>c;
  v.push_back(c);
 }
 for(int i=0;i<m3;i++)
 {
  int a,b;
  cin>>a>>b;
  cnt[b]++;
  vv[a].push_back(b);
 }
 for(int i=0;i<v.size();i++)
 {
  memset(A,0,sizeof(A));
  dfs(v[i]);
 }
 int ss=0;
 for(int i=0;i<=m2;i++)
 {
  if(D[i]==m1) ss++;
 }
 cout<<ss;
 } 

上一篇:

下一篇: