| ||||||||||
| 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>
using namespace std;
struct gather
{
int p;
int rank;
};
gather* makegather(int len)
{
gather *a = new gather[len+1];
for(int i=0; i<=len; i++)
a[i].p = a[i].rank = 0;
return a;
}
int find(gather* arr, int x)
{
int root,y,t;
y = x;
while(arr[y].p != 0)
{
y = arr[y].p;
}
root = y;
y = x;
while(arr[y].p != 0)
{
t = arr[y].p;
arr[y].p = root;
y = t;
}
return root;
}
void unio(gather *arr,int x, int y)
{
x = find(arr,x);
y = find(arr,y);
if(arr[x].rank <= arr[y].rank)
{
arr[x].p = y;
if(arr[x].rank == arr[y].rank)
arr[y].rank++;
}
else arr[y].p = x;
}
struct road
{
int distance;
int a,b;
};
void merge(road* arr,int a, int k, int b)
{
int i,j,point;
road *buffer = new road[b-a+1];
i=a; j=k+1; point=0;
while(i<=k && j<=b)
{
if(arr[i].distance < arr[j].distance)
buffer[point++] = arr[i++];
else
buffer[point++] = arr[j++];
}
if(i == k+1)
for(;j<=b;j++)
buffer[point++]=arr[j];
else
for(;i<=k;i++)
buffer[point++]=arr[i];
for(i=a,point=0;i<=b;i++)
arr[i] = buffer[point++];
}
void busort(road* arr,int len)
{
int width;
int i;
width = 2;
int a,b;
while(width/2 < len)
{
for(i=0; i<len; i+=width)
{
a = i;
b = i+width-1;
b = b<len-1?b:len-1;
merge(arr,a,(a+b)/2,b);
}
width = width*2;
}
}
int main()
{
road *roadlist;
int *map;
gather *arr;
int city;
int connect;
int i,j;
int a,b;
int dif;
int point;
int llen;
int cost;
cin>>city;
//initial map,arr,dif;
map = new int[city*city];
arr = makegather(city);
dif = city;
for(i=0;i<city;i++)
for(j=0;j<city;j++)
cin>>map[i*city + j];
//procede existing connect
cin>>connect;
for(i=0;i<connect;i++)
{
cin>>a>>b;
map[(a-1)*city + b-1] = map[(b-1)*city + a-1] = 0;
if(find(arr,a) != find(arr,b))
{
unio(arr,a,b);
dif--;
}
}
//ranke roadlist
roadlist = new road[city*(city-1)/2 - connect];
point = 0;
for(i=0;i<city-1;i++)
for(j=i+1;j<city;j++)
{
if(map[i*city + j] != 0)
{roadlist[point].distance = map[i*city + j];
roadlist[point].a = i+1;
roadlist[point].b = j+1;
point++;}
}
if(point != city*(city-1)/2 - connect)
{cout<<"point error!"<<endl; exit(0);}
busort(roadlist,point);
llen = point;
//caculate the minix cost
cost = 0;
for(point=0; point<llen; point++)
{
if(find(arr,roadlist[point].a) != find(arr,roadlist[point].b))
{
unio(arr,roadlist[point].a,roadlist[point].b);
dif--;
cost += roadlist[point].distance;
point++;
if(dif == 1) break;
}
}
//out put
cout<<cost<<endl;
return 1;}
Followed by:
Post your reply here: |
All Rights Reserved 2003-2013 Ying Fuchen,Xu Pengcheng,Xie Di
Any problem, Please Contact Administrator