1160-繁杂的道路

描述

A城是由许多小城镇组成的,在A城的各个小城镇间建了许多道路(道路是双向的)。这些道路是A城便利交通的基础。游客通过这些道路可以在任意两个城镇之间往返。最近市长对这座城市错综复杂的交通感到厌烦,决定重新规划A城的道路。所以他派给你一个任务:留下尽可能少的道路,保证任意两个城镇之间还是可达的。将其他多余的道路全部拆除。

输入

第一行为两个正整数n1<=n<=100)和mn表示A城中小城镇的数量。M表示现有道路的数量。接下来是m行,每行用两个数v1v2表示一条从城镇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;
} 

  

posted @ 2013-11-22 10:07  七年之后  阅读(301)  评论(0编辑  收藏  举报