有向图的最小生成树 --- 最小树形图模板

模板题 . UVA--- 11183传送

还有这道 POJ 3164 点这传送

举个例子:某个图的部分图中, 1->2权值为3, 2->1权值为4, 3->1权值为9, 4->2权值为7。 那么可以看到,结点1和结点2是形成了一个环的。我们仅从其大小不知道删除哪条边比较好,这时看到3->1权值为9, 如果走这条边,那么接下来只能删除掉2->1这条边,同理走4->2的话就要删除掉1->2这条边。 那么就不妨建立新图, 将1和2缩成一点,3->1的权值就变成了9-4=5, 4->2的权值变成了7-3=4。 这样的话,就相当于变相删除了不需要走的边了。形成新图后,又变成了最小树形图的求解,就这样循环下去,直到图中的最小边集没有环为止.

裸模板,直接上:

#include
#include
#include
#include
#include
#define ll long long int
#define db double
using namespace std;
const int maxn=1e3;  //点数[0-n-1]
const int maxm=1e7;  //边数
const int inf=1e9;
int n,m;
struct edge
{
    int u,v,w;
} s[maxn*maxn/2];

int pre[maxn]; //记录前驱.
int id[maxn];
int vis[maxn];
int in[maxn];

void p(int *a,int n)
{
    for(int i=1;i<=n;i++)
        printf("%d%c",a[i],i==n?'\n':' ');
}
int dirMst(int root)   //这种图中根一定是确定的.
{
    int ans=0;
    while(1)
    {
        for(int i=0; i> t;
    while(t--)
    {
        scanf("%d%d",&n,&m);
        for(int i=0; i

你可能感兴趣的:(有向图的最小生成树 --- 最小树形图模板)