poj 1679 Prim判断次短路

来源:互联网 发布:形容网络发达的句子 编辑:程序博客网 时间:2024/06/08 14:08

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

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

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

 

代码:

#include<iostream>#include<cstring>#include<cstdio>#define MAXN 5050#define inf 100000000using 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!\n");        else printf("%d\n",mst);    }    return 0;}


 

原创粉丝点击