Invitation Cards HDU

来源:互联网 发布:管家婆软件价格 编辑:程序博客网 时间:2024/06/01 10:03
点击打开链接
题意为 从1出发到其他所有点 路费多少 再从各点回来 路费多少 两者相加
其他都是废话 比赛时题意就没理解
#include <stdio.h>#include <vector>#define N 9999999999using namespace std;struct node{    int v;    int w;};vector <struct node> edge1[1000001];vector <struct node> edge2[1000001];long long dis[1000001];long long sum1,sum2;int book[1000001];int n,m;void calculate1();void calculate2();int main(){    struct node t;    int i,j,a,b,c,tem;    scanf("%d",&tem);    while(tem--)    {        scanf("%d%d",&n,&m);        for(i=1;i<=n;i++)        {            edge1[i].clear();            edge2[i].clear();        }        for(i=1;i<=m;i++)        {            scanf("%d%d%d",&a,&b,&c);            t.v=b;            t.w=c;            edge1[a].push_back(t);            t.v=a;            t.w=c;            edge2[b].push_back(t);        }        sum1=0;        calculate1();        sum2=0;        calculate2();        printf("%lld\n",sum1+sum2);    }    return 0;}void calculate1(){    struct node t;    long long minn;    int i,j,p;    for(i=1;i<=n;i++)    {        dis[i]=N;        book[i]=0;    }    dis[1]=0;    for(i=0;i<edge1[1].size();i++)    {        t=edge1[1][i];        dis[t.v]=t.w;    }    book[1]=1;    for(i=1;i<=n-1;i++)    {        minn=N;        for(j=1;j<=n;j++)        {            if(book[j]==0&&minn>dis[j])            {                minn=dis[j];                p=j;            }        }        book[p]=1;        for(j=0;j<edge1[p].size();j++)        {            t=edge1[p][j];            if(book[t.v]==0&&dis[t.v]>dis[p]+t.w)            {                dis[t.v]=dis[p]+t.w;            }        }    }    for(i=1;i<=n;i++)    {        sum1+=(long long)dis[i];    }    return;}void calculate2(){    struct node t;    long long minn;    int i,j,p;    for(i=1;i<=n;i++)    {        dis[i]=N;        book[i]=0;    }    dis[1]=0;    for(i=0;i<edge2[1].size();i++)    {        t=edge2[1][i];        dis[t.v]=t.w;    }    book[1]=1;    for(i=1;i<=n-1;i++)    {        minn=N;        for(j=1;j<=n;j++)        {            if(book[j]==0&&minn>dis[j])            {                minn=dis[j];                p=j;            }        }        book[p]=1;        for(j=0;j<edge2[p].size();j++)        {            t=edge2[p][j];            if(book[t.v]==0&&dis[t.v]>dis[p]+t.w)            {                dis[t.v]=dis[p]+t.w;            }        }    }    for(i=1;i<=n;i++)    {        sum2+=(long long)dis[i];    }    return;}