/*關於最小生成樹的等效邊,就是講兩個相同的集合連線在一起
先建立乙個任意最小生成樹,這條邊分開的兩個子樹的節點最大的乙個和為a,sum為最小生成樹的權值和,b為sum-當前邊的權值
不斷列舉最小生成樹中的邊找最優值即可。
*/#include#include#include#include#define n 1100
struct nodee
edge[n*n];
struct node
bian[n*n];
int index,yong,head[n],visit[n],n,pre[n],flag[n],c[n],aa[n],bb[n];
double ans;
double sum;
void init()
int cmp(const void *a,const void *b)
double distance(int u,int v)
int find(int x)
void addedge(int u,int v,double w)
void creat()
}return ;
}void dfs(int u)//定義全域性變數好點
}if(ansans=c[u];
}int main()
qsort(edge,index,sizeof(edge[0]),cmp);
creat();
m=-1;
for(i=1; iprintf("%.2f\n",m);
}return 0;
}
hdu 4081 最小生成樹
先求出最小生成樹,然後列舉樹上的邊,對於每條邊 分別 找出這條割邊形成的兩個塊中點權最大的兩個 1.由於結果是a b,a的變化會引起b的變化,兩個制約,無法直接貪心出最大的a b,故要通過列舉 2.不管magic road要加在 加的邊是否是最小生成樹上的邊,都會產生環,我們都要選擇一條邊刪掉 注意...
HDU 4081 次小生成樹變形
題意是有n個點,分別輸入n個點的座標和這個點的權值,然後要給這些點建邊,建邊的權值就是兩點間的距離,現在可以免費的建一條邊,求免費建邊的兩個點的權值和與總費用的最大值。思路就是模擬次小生成樹的思路,在刪邊的過程中維護所要求的最大值就好了。ac include define maxn 1005 def...
hdu 4081 次小生成樹
找到乙個生成樹,並且保證a b最大,所以b要盡量小,a盡量大。b盡量小,就要想到最小生成樹,但是最小生成樹裡面,可以刪除乙個邊,這樣就轉化為次小生成樹中找a b最大的情況。或者prim 並查集。include include include include include using namespa...