描述
A城是由许多小城镇组成的,在A城的各个小城镇间建了许多道路(道路是双向的)。这些道路是A城便利交通的基础。游客通过这些道路可以在任意两个城镇之间往返。最近市长对这座城市错综复杂的交通感到厌烦,决定重新规划A城的道路。所以他派给你一个任务:留下尽可能少的道路,保证任意两个城镇之间还是可达的。将其他多余的道路全部拆除。
输入
第一行为两个正整数n(1<=n<=100)和m。n表示A城中小城镇的数量。M表示现有道路的数量。接下来是m行,每行用两个数v1和v2表示一条从城镇v1到城镇v2的道路。( v1!=v2),两个城镇之间至多有一条道路。
输出
输出最多能够拆除的道路数量。
样例输入
5 7
4 6
1 2
1 3
1 4
2 3
2 4
3 4
样例输出
3
#include<iostream> using namespace std; #define MAXT 1001 #define MAXK 31 inline int max(int a,int b) { return a>b?a:b; } int main() { int t,k,i,j; cin>>t>>k; int a[MAXT]; int p[MAXT][MAXK]; for(i=1;i<=t;i++) cin>>a[i]; p[0][0]=0; for(i=1;i<=t;i++) { p[i][0]=p[i-1][0]+a[i]%2; for(j=1;j<=k;j++) { p[i][j]=max(p[i-1][j-1],p[i-1][j])+(j%2==(a[i]-1)?1:0); } } int max=0; for(j=1;j<=k;j++) if(p[t][j]>max) max=p[t][j]; cout<<max<<endl; return 0; }