一个人给自己要点亮的灯安装上了传感器,点亮一盏灯可以染附近的灯都亮起来。
给出可以亮灯的关系 比如1 2
计算最少点亮几盏灯可以让所有的灯都亮起来。
一定要从拓扑序列最高的开始点亮,这样每次点亮的灯的数量是最多的
#include<stdio.h>
#include<vector>
#include<string.h>
using namespace std;
vector<int> G[15000];
int nv,ne;
vector<int> topo;
bool used[20000];
void dfs(int n)
{
used[n]=1;
for(int i=0;i<G[n].size();i++)
{
int v=G[n][i];
if(!used[v])
dfs(v);
}
topo.push_back(n);
}
//start from one
int main()
{
int cas;
scanf("%d",&cas);
for(int T=1;T<=cas;T++)
{
topo.clear();
memset(G,0,sizeof(G));
memset(used,0,sizeof(used));
scanf("%d%d",&nv,&ne);
for(int i=0;i<ne;i++)
{
int f,t;
scanf("%d%d",&f,&t);
G[f].push_back(t);
}
for(int i=1;i<=nv;i++)
{
if(!used[i])
dfs(i);
}
int k=0;
memset(used,0,sizeof(used));
for(int i=nv-1;i>=0;i--)
{
int v=topo[i];
if(!used[v])
{
k++;
dfs(v);
}
}
printf("Case %d: %d\n",T,k);
}
return 0;
}