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 |
Re:好心的大牛给我测试一下吧。WA快疯了。In Reply To:好心的大牛给我测试一下吧。WA快疯了。 Posted by:20074635 at 2009-11-26 12:20:37 > #include<iostream> > #include<cstring> > #include<cstdio> > using namespace std; > const int size = 50; > int max( int a,int b) > { > return a>b?a:b; > } > int min( int a, int b) > { > return a<b?a:b; > } > struct node > { > int id; > char name[size]; > }address[size]; > const int INF = 999999999; > struct > { > int a, b; > int val; > }value[size][size]; > typedef int G[size][size]; > G graph; > char name1[size], name2[size]; > > int stack[size]; > int pre[size]; > int n; > int m; > int val; > int total; > int k;//最大度 > bool edge[size][size]; > bool flag[size]; > void init() > { > for (int i=0; i<size ;i++) > for (int j=0; j<size; j++) > graph[i][j] = INF; > memset( edge, false, sizeof(edge)); > total = 0; > } > void deal( char s1[], char s2[], int value) > { > int id1=1, id2=1, i; > if( strcmp( "Park", s1) == 0) > id1 = 0; > if( strcmp( "Park", s2) == 0) > id2 = 0; > if( id1 ) > { > for ( i=1; i<=m; i++) > { > if( strcmp( s1, address[i].name) ==0) > { > id1 = i; break; > } > } > if( i > m) > { > strcpy( address[++m].name, s1); > address[m].id = m; > id1 = m; > } > } > if( id2 ) > { > for ( i=1; i<=m; i++) > { > if( strcmp( s2, address[i].name)==0) > { > id2 = i; break; > } > } > if( i > m ) > { > strcpy( address[ ++m ].name, s2 ); > address[m].id = m; > id2 = m; > } > } > graph[id1][id2] = graph[id2][id1] = value; > } > > void prim( ) > { > int i, j; > bool visited[100]; > memset( visited, false,sizeof(visited)); > memset( value, 0, sizeof( value )); > int top = 0; > int cost[100]; > for (i = 1; i <= m; i++) > { > cost[i] = graph[1][i]; > pre[i] = 1; > } > visited[1] = true; > stack[top++] = 1; > for (i=1; i < m; i++) > { > int min = INF, k = -1; > for (j=1; j <= m; j++) > if( !visited[j] && cost[j] < min) > min = cost[j], k=j; > for (j=0; j<top; ++j) > { > if( min > value[ stack[j] ][ pre[k] ].val ) > { > value[ stack[j] ][ k ].val = min; > value[ stack[j] ][ k ].a = pre[k]; > value[ stack[j] ][ k ].b = k; > value[ k ][ stack[j] ] = value[ stack[j] ][ k ]; > } > } > visited[ k ] = true; > total += min; > stack[ top++ ] = k; > edge[ pre[k] ][ k ] = edge[ k ][ pre[k] ] = true; > for (j=1; j<=m; j++) > if(!visited[j] && (graph[k][j] < cost[j] ) ) > cost[j] = graph[k][j], pre[j] = k; > } > } > void dfs( int now ) > { > flag[now] = true; > for ( int i=1; i <= m; i++) > { > if(flag[i]) > continue; > if ( edge[i][now] || edge[now][i]) > { > //pre[ i ] = now; > if( value[ now][0].val < graph[i][now] ) > { > value[i][0].val = graph[i][now]; > value[i][0].a = now; > value[i][0].b = i; > } > else > { > value[i][0] = value[now][0]; > } > dfs( i ); > > } > } > } > > int result( ) > { > int i, j; > int minval=INF; > int index; > > for (i=1; i<=m; i++) > { > if( graph[i][0] <INF && minval > graph[i][0] ) > { > minval = graph[i][0]; > index = i;//先添加的第一条最小权值的边 > } > } > total += minval; > edge[0][index] = edge[index][0] = 1;//表明这里的边已经添加到生成树里面 > /*for (i=1; i<=m; i++) > { > value[i][0] = value[0][i] = value[i][index]; > } > pre[0] = i;*/ > int mininum ; > int p1 = index; > > for (i = 2; i <= k && i <= m; i++) > { > > mininum = INF; > memset(flag, false, sizeof(flag)); > dfs( p1 ); > for (j = 1; j <= m; j++) > { > if( graph[j][0] != INF && !edge[j][0])//stand for there is an edge between them并且这条边还没有被添加 > { > if( graph[j][0] - value[j][0].val < mininum) > { > mininum = graph[j][0] - value[j][0].val;//最少添删 > p1 = j; > } > } > } > edge[ p1 ][ 0 ] = edge[0][p1] = true; > value[ p1][ 0 ].val = 0; > edge[ value[p1][0].a ][ value[p1][0].b ] = false; > edge[ value[p1][0].b ][ value[p1][0].a ] = false; > if( mininum >= 0 ) > return total; > total += mininum; > > > } > return total; > } > > int main() > { > freopen("in.txt","r",stdin); > while (scanf("%d", &n) ==1) > { > m = 0; > init(); > for (int i=0; i < n; i++) > { > scanf("%s%s%d", name1, name2, &val); > deal( name1, name2, val); > } > scanf("%d",&k); > prim(); > printf("Total miles driven: %d\n", result() ); > > } > return 0; > } > > > > Followed by: Post your reply here: |
All Rights Reserved 2003-2013 Ying Fuchen,Xu Pengcheng,Xie Di
Any problem, Please Contact Administrator