SDUTOJ3309----乱七八糟的图

来源:互联网 发布:淘宝店加权重有哪些 编辑:程序博客网 时间:2024/05/22 15:05

乱七八糟的图

Time Limit: 4000ms   Memory limit: 65536K  有疑问?点这里^_^

题目描述

给一个连通无向图,图有n个顶点m条边,可能会有重边,无自环。然后给一个出发点st,现在这个st到其他每一个顶点都有一个最短距离。然后,让你删除一些边,剩下的边构成了一个新连通无向图,要求在新图中,出发点st到其他任何一个顶点的最短距离跟删边之前的最短距离保持不变,而且要求剩下的所有边的总长度最短。求出这个总长度。

输入

 多组输入。每组测试数据第一行为两个整数n(1<=n<=3*10^4)m(1<=m<=3*10^5).接下来m行,每行包括三个整数u,v,w.(1<=u,v<=n,1<=w<=10^9),表示顶点uv之间有一条长度为w的无向边。最后一行给出一个整数st(1<=st<=n)表示出发点。

输出

 每组测试数据输出一个整数表示最短的总长度。

示例输入

3 31 2 12 3 11 3 234 41 2 12 3 13 4 14 1 24

示例输出

24
#include <iostream>#include<cstdio>#include<cstring>#include<cmath>#include<algorithm>#include<queue>#include<stack>#include<climits>#include<map>#define LL long longusing namespace std;int n,m;const int N = 3e4+10;const int M=6e5+10;const LL INF =LONG_LONG_MAX>>1;struct node{    int u,v;    LL w;    int next;} T[M];int head[N];LL dis[N];int path[N];bool flag[N];int top;queue<int>Q;map<pair<int,int>,bool>S;void creat(int u,int v,LL w){    T[top].u=u;    T[top].v=v;    T[top].w=w;    T[top].next=head[u];    head[u]=top++;}void SPFA(int str){    memset(flag,0,sizeof(flag));    for(int i=1; i<=n; i++)    {        dis[i]=INF;        path[i]=-1;    }    dis[str]=0;    Q.push(str);    flag[str]=1;    int u,v;    LL g;    while(!Q.empty())    {        u=Q.front();        Q.pop();        flag[u]=0;        for(int i=head[u]; i!=-1; i=T[i].next)        {            v=T[i].v;            g=dis[u]+T[i].w;            if(dis[v]>g)            {                dis[v]=g;                path[v]=u;                if(!flag[v])                {                    flag[v]=1;                    Q.push(v);                }            }        }    }}void solve(int str){    int u;    LL g,w;    LL tmp;    LL ans=0;    for(int i=1; i<=n; i++)    {        if(i==str)            continue;        tmp=INF;        for(int j=head[i]; j!=-1; j=T[j].next)        {            u=T[j].v;            g= dis[u]+(w=T[j].w);            if(dis[i]==g&&w<tmp)            {                path[i]=u;                tmp=w;            }        }        ans+=tmp;    }    printf("%lld\n",ans);}int main(){    int u,v;    LL w;    int str;    while(~scanf("%d%d",&n,&m))    {        memset(head,-1,sizeof(head));        top=0;        for(int i=0; i<m; i++)        {            scanf("%d%d%lld",&u,&v,&w);            creat(u,v,w);            creat(v,u,w);        }        scanf("%d",&str);        while(!Q.empty())Q.pop();        SPFA(str);        solve(str);    }    return 0;}

 
0 0