美团编程 无向图 全1
题目一:图的遍历
说给了一张包含个N个点N-1条边的无向连通图,节点从1到N编号,每条边长度均为1,设你从1号节点出发并打算遍历所有节点,那么总路程至少是多少?
输入:第一行包含一个整数N,接下来N-1行,每行包括两个整数x,y表示x与y之间有一条边
输出:总路程最小和
样例:
4
1 2
1 3
3 4
输出:4
思路:一共n-1条边,每个边走两次,一共2*(n-1) ,有边不走两次,也就是不回头,减去一次,当走的路径为最大深度deep时候,总路程最小为2*(n-1)-deep
#include <bits/stdc++.h> using namespace std; const int N = 1e5+10; vector<int> vec[N]; int ans; void dfs(int x, int old, int w) { for(int i=0;i<vec[x].size();i++){ if(vec[x][i]==old){ continue; } dfs(vec[x][i],x,w+1); } ans = max(ans, w); } int main() { int n; scanf("%d", &n); for(int i = 1; i < n; ++ i) { int x, y; scanf("%d%d", &x, &y); vec[x].push_back(y); vec[y].push_back(x); } ans = 0; dfs(1, -1, 0); printf("%d\n", (n-1)*2-ans); return 0; }
题目二:最长全1串
给你一个01串,定义答案=该串中最长的连续1的长度,现在有k次机会将某个0改为1,现在问最大可能答案
输入:第一行 n k
第二行 n个数
样例:
输入:
10 2
1 0 0 1 0 1 0 1 0 1
输出:
5
思路:遍历这n个数,将为0 的 push进vec,只考虑vec
初始最长maxlen为vec[k]-1,vec[k]表示第k+1个0所在位置,vec[k]-1就是初始最大长度,vec[i]-vec[i-k-1]-1 就是将i-k-1到i之间0变为1的长度
#include <iostream> #include<bits/stdc++.h> using namespace std; vector<int> vec; int main() { int n,k,x; cin>>n>>k; for(int i=1;i<=n;i++){ cin>>x; if(x==0) vec.push_back(i); } int maxlen=vec[k]-1; for(int i=k+1;i<=vec.size();i++){ int tmp=vec[i]-vec[i-k-1]-1; maxlen=max(maxlen,tmp); } cout<<maxlen<<endl; return 0; }
#美团##笔试题目#