| ||||||||||
| 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 | |||||||||
好心的大牛给我测试一下吧。WA快疯了。#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