| ||||||||||
| Online Judge | Problem Set | Authors | Online Contests | User | ||||||
|---|---|---|---|---|---|---|---|---|---|---|
| Web Board Home Page F.A.Qs Statistical Charts | Current Contest Past Contests Scheduled Contests Award Contest | |||||||||
一直TLE....求救啊!!!#include<iostream>
#include<stdio.h>
#include<string.h>
#include<string>
#include<sstream>
#include<algorithm>
#include<math.h>
#include<map>
#include<vector>
using namespace std;
struct edge{
int e , next ;
} edges[101000] ;
int head[300] , ne , weight[300] ;
bool used[300] , visit[300] ;
int dp[300][300] , num[300] ;
int n , m ;
void add_edge( int a , int b )
{
edges[ne].e = b ;
edges[ne].next = head[a] ;
head[a] = ne ++ ;
}
void DFS( int now )
{
int temp = head[now] ;
dp[now][0] = 0 ;
num[now] = 1 ;
visit[now] = true ;
while( temp != -1 ){
if( visit[edges[temp].e] ) continue ;
DFS( edges[temp].e ) ;
num[now] += num[edges[temp].e] ;
temp = edges[temp].next ;
}
temp = head[now];
while( temp != -1 )
{
for( int j = num[now] ; j >= 0 ; j -- )
{
for( int i = 0 ; j-i >= 0 ; i ++ )
{
if( dp[now][j] > dp[now][j-i] + dp[edges[temp].e][i] )
dp[now][j] = dp[now][j-i] + dp[edges[temp].e][i] ;
}
}
temp = edges[temp].next ;
}
if( weight[now] < dp[now][num[now]] )
dp[now][num[now]] = weight[now] ;
return ;
}
int main()
{
map<string,int> node;
char str[20100] ;
string hold ;
while( gets(str) ){
if( !str[0] ) continue ;
memset( head , -1 , sizeof(head) ) ;
memset( used , false , sizeof(used) ) ;
memset( dp , 11 , sizeof(dp) );
memset( num , 0 , sizeof(num) );
memset( visit , false , sizeof(visit) );
ne = 0 ;
int top = 0 , father , son ;
if( str[0] == '#' )
break ;
sscanf(str,"%d%d",&n,&m);
for( int i = 1 ; i <= n ; i ++ )
{
scanf("%s",str);
if( node.find(str) == node.end() )
{
node[str] = ++top;
father = top ;
}
else
father = node[str] ;
scanf("%d",&weight[father]);
gets(str) ;
stringstream ss(str) ;
while( ss >> hold )
{
if( node.find(hold) == node.end() )
{
node[hold] = ++top ;
son = top ;
}
else
son = node[hold] ;
used[son] = true ;
add_edge(father,son);
}
}
weight[0] = 999999999 ;
for( int i = 1; i <= n ; i ++ )
if( !used[i] )
add_edge(0,i);
DFS(0);
int ans = 999999999 ;
//for( int i = 0 ; i <= n ; i ++ )
//{
// for( int j = 0 ; j <= n+1 ; j ++ )
// {
// printf("%d ",dp[i][j]);
//
// printf("\n");
//} }
for( int i = m ; i <= n ; i ++ )
if( dp[0][i] < ans )
ans = dp[0][i] ;
printf("%d\n",ans) ;
}
}
Followed by: Post your reply here: |
All Rights Reserved 2003-2013 Ying Fuchen,Xu Pengcheng,Xie Di
Any problem, Please Contact Administrator