zoukankan      html  css  js  c++  java
  • poj 1679 Prim判断次短路

    题意:判断最短路是否唯一。

    思路:先prrim一次求出最短路同时记录最短路加入的边;

    然后枚举所求边,将其删除再求n-1次prim,判断再次所求得的最短路与第一次求得的次短路的关系。

    代码:

    #include<iostream>
    #include<cstring>
    #include<cstdio>
    #define MAXN 5050
    #define inf 100000000
    using namespace std;
    
    struct Edge{
        int u,v,w;
    }edge[MAXN];
    
    int n,m,mst;
    int map[MAXN][MAXN],dis[MAXN],fit[MAXN];
    bool unique;
    
    void prim()
    {
        int i,j,now,minn,mine;
        int num;int k=0;
        unique=true;
        for( i=0;i<=n;i++)
        {
            dis[i]=inf;
        }
        mst=0;
        now=1;
        for( i=1;i<n;i++)
        {
            dis[now]=-1;
            mine=inf;
            for( j=1;j<=n;j++)
            {
                if(j!=now&&dis[j]>=0)
                {
                    if(map[now][j]<dis[j])
                    {
                        dis[j]=map[now][j];
                        fit[j]=now;
                    }
                    if(dis[j]<mine)
                    {
                        mine=dis[j];
                        minn=j;
                    }
                }
            }
            if(mine==inf)
            {
                mst=0;
                return ;
            }
            edge[k].u=minn;
            edge[k].v=fit[minn];
            edge[k].w=map[minn][fit[minn]];
            k++;
            now=minn;
            mst+=mine;
        }
        num=k;
        for(k=0;k<num;k++)
        {
            map[edge[k].u][edge[k].v]=inf;
            map[edge[k].v][edge[k].u]=inf;
            if(i!=0)
            {
                 map[edge[k-1].u][edge[k-1].v] = edge[k-1].w;
                    map[edge[k-1].v][edge[k-1].u] = edge[k-1].w;
            }
            for(i = 1; i <= n; i ++)
                dis[i] = inf;
    
            int mst2=0;
            bool flag=true;
            now=1;
            for(i=1;i<n;i++)
            {
                dis[now]=-1;
                mine=inf;
                for(j=1;j<=n;j++)
                {
                    if(j!=now&&dis[j]>=0)
                    {
                        if(map[now][j]<dis[j])
                        {
                            dis[j]=map[now][j];
                        }
                        if(dis[j]<mine)
                        {
                            mine=dis[j];
                            minn=j;
                        }
                    }
                }
                if(mine==inf)
                    {
                        flag=false;
                        break;
                    }
                now=minn;
                mst2+=mine;
            }
            if(flag&&mst2==mst)
                {
                    unique=false;
                    return ;
                }
        }
    
    }
    
    int main()
    {
        int T;
        scanf("%d",&T);
        while(T--)
        {
            scanf("%d%d",&n,&m);
            for(int i=1;i<=n;i++)
            {
                for(int j=1;j<=n;j++)
                {
                    map[i][j]=inf;
                }
            }
            for(int i=0;i<m;i++)
            {
                int v,w,c;
                scanf("%d%d%d",&v,&w,&c);
                map[v][w]=c;
                map[w][v]=c;
            }
            prim();
            if(!unique)printf("Not Unique!
    ");
            else printf("%d
    ",mst);
        }
        return 0;
    }
    


     

  • 相关阅读:
    MySQL 练习题
    MySQL 增删查改
    HTML显示与隐藏
    360布局
    div布局
    HTML练习2
    HTML练习

    if语句的用法及其案例
    输入输出,数据类型与运算符
  • 原文地址:https://www.cnblogs.com/amourjun/p/5134130.html
Copyright © 2011-2022 走看看