hdu 1535 Invitation Cards 最短路spfa+逆向建图

来源:互联网 发布:淘宝店铺怎么提现 编辑:程序博客网 时间:2024/06/05 16:00

题意:求起始点到各点的来回最短路径总和。

建一张正向图,一张反向图,由于数据较大,用邻接表存储。

#include <iostream>#include<cstdio>#include<cmath>#include<cstring>#include<queue>#define N 1100000#define INF 0x7ffffffusing namespace std;struct node{    int next,to,w;}e[N][2];int head[N][2],n,cnt[2],d[N],v[N];void add_edge(int u,int v,int w,int t){    e[cnt[t]][t].to=v;    e[cnt[t]][t].w=w;    e[cnt[t]][t].next=head[u][t];    head[u][t]=cnt[t]++;}int spfa(int t){    for(int i=1;i<=n;i++)   d[i]=INF,v[i]=0;    queue<int> q;    q.push(1);    v[1]=1;    d[1]=0;    while(!q.empty())    {        int c=q.front();        q.pop();        v[c]=0;        for(int i=head[c][t];i!=-1;i=e[i][t].next)        {            int u=e[i][t].to,w=e[i][t].w;            if(d[u]>d[c]+w)            {                d[u]=d[c]+w;                if(!v[u])   v[u]=1,q.push(u);            }        }    }    int ans=0;    for(int i=1;i<=n;i++)   ans+=d[i];    return ans;}int main(){    int T,m;    scanf("%d",&T);    while(T--)    {        scanf("%d%d",&n,&m);        memset(head,-1,sizeof(head));        cnt[0]=cnt[1]=0;        for(int i=0;i<m;i++)        {            int u,v,w;            scanf("%d%d%d",&u,&v,&w);            add_edge(u,v,w,0);            add_edge(v,u,w,1);        }        cout<<spfa(0)+spfa(1)<<endl;    }}

0 0
原创粉丝点击