题意:n个城市,k个警察局,求最多删除几条边,使得每个城市都可以在d长度内到达一个警察局。
思路:贪心,使得每个城市的居民去离他最近的警察局,那么就可以有一些不必要的边可以被删除。然后用map存储下每条边的标号。从所有警察局开始深度搜索,遇到没有被接受的,并且本身没有警察局的城市就接受他,说明当前这条道路是该城市到警察局的最短路。
unordered_set<int> st;
queue<int> q;
vector<int> G[N];
map<pii, int> mp;
bool vis[N];
int bfs()
{
int ans =0;
while (!q.empty())
{
auto it = q.front();q.pop();
for (auto I : G[it])
{
if (!vis[I] && !st.count(I))
{
int mi = min(I, it), mx = max(I, it);
mp[{mi, mx}] = 0;
ans++;
q.push(I);
vis[I] = true;
}
}
}
return ans;
}
int main()
{
//freopen("in.txt", "r", stdin);
int n, k, d,x,y;
while (cin>>n>>k>>d)
{
f(i, 1, k)
{
scanf("%d", &x);
st.insert(x);
q.push(x);
vis[x] = true;
}
f(i, 1, n-1)
{
scanf("%d%d", &x, &y);
G[x].emplace_back(y);
G[y].emplace_back(x);
if (x > y)swap(x, y);
mp[{x, y}] = i;
}
int ans = bfs();
cout << n - 1 - ans << endl;
for (auto I : mp)
{
if (I.second != 0)printf("%d ", I.second);
}
}
return 0;
}