HDU 1535

来源:互联网 发布:js date 初始化 编辑:程序博客网 时间:2024/04/30 06:14

题意:求源点到其他各点的最短距离和,边是有向边

分析:正向反向分别建一个图,求2次SPFA,算距离,一次过感觉非常棒呐。


#include <iostream>#include<cstdio>#include<algorithm>#include<cstring>#include<string>#define N 1000005#include<vector>#include<queue>#define INF 1<<30using namespace std;int p,cnt,head1[N],head2[N],vis[N],dis[N];struct edge{    int u,next,w;}e1[N],e2[N];void init(){    cnt=0;    memset(head1,-1,sizeof(head1));    memset(head2,-1,sizeof(head2));}void addedge(int u,int v,int w){    e1[cnt].u=u;e1[cnt].w=w;e1[cnt].next=head1[v];head1[v]=cnt;    e2[cnt].u=v;e2[cnt].w=w;e2[cnt].next=head2[u];head2[u]=cnt;    cnt++;}int spfa1(int u){    int v,i,now;    memset(vis,0,sizeof(vis));    queue<int>q;    q.push(u);    dis[u]=0;    for(i=2;i<=p;i++){        dis[i]=INF;    }    vis[u]=1;    while(!q.empty()){        now=q.front();        q.pop();        vis[now]=0;        for(i=head1[now];i!=-1;i=e1[i].next){            v=e1[i].u;            if(dis[now]+e1[i].w<dis[v]){                dis[v]=dis[now]+e1[i].w;                if(!vis[v]){                    q.push(v);                    vis[v]=1;                }            }        }    }    int ret=0;    for(i=1;i<=p;i++){        ret+=dis[i];    }    return ret;}int spfa2(int u){    int v,i,now;    memset(vis,0,sizeof(vis));    queue<int>q;    q.push(u);    dis[u]=0;    for(i=2;i<=p;i++){        dis[i]=INF;    }    vis[u]=1;    while(!q.empty()){        now=q.front();        q.pop();        vis[now]=0;        for(i=head2[now];i!=-1;i=e2[i].next){            v=e2[i].u;            if(dis[now]+e2[i].w<dis[v]){                dis[v]=dis[now]+e2[i].w;                if(!vis[v]){                    q.push(v);                    vis[v]=1;                }            }        }    }    int ret=0;    for(i=1;i<=p;i++){        ret+=dis[i];    }    return ret;}int main(){    int t,u,v,w,q,ans;    scanf("%d",&t);    while(t--){        init();        scanf("%d%d",&p,&q);        while(q--){            scanf("%d%d%d",&u,&v,&w);            addedge(u,v,w);        }        ans=spfa1(1);        ans+=spfa2(1);        printf("%d\n",ans);    }    return 0;}


0 0