hdoj 1535 最短路求来回n个点的最短路。反向见边

题目链接http://acm.hdu.edu.cn/showproblem.php?pid=1535

题意t组数据  p个点Q条边。求1道每个点以及每个点到1的最短路径。。1到任意的距离直接spaf求。。而每个点到1只要反向建边。在spaf就可以了。,。数据大 邻接表建图

献上ac代码

  1 #include<stdio.h>
  2 #include<queue>
  3 #include<iostream>
  4 using namespace std;
  5 #define maxn 1<<30
  6 #define count count2
  7 struct st
  8 {
  9     int start;
 10     int end;
 11     int v;
 12     int next;
 13 }map1[1000010],map2[1000010];
 14 int head[1000010],head1[1000010],dis[1000010], vis[1000010];
 15 int count,count1, n;
 16 
 17 void add(int start,int end,int v)
 18 {
 19   map1[count].start=start,map1[count].end=end,map1[count].v=v;
 20   map1[count].next=head[start];
 21   head[start]=count++;
 22 }
 23 
 24 void add1(int start,int end,int v)
 25 {
 26   map2[count1].start=start,map2[count1].end=end,map2[count1].v=v;
 27   map2[count1].next=head1[start];
 28   head1[start]=count1++;   
 29 }
 30 
 31 int spaf()
 32 {
 33     int i;
 34     memset(vis,0,sizeof(vis));
 35     for(i=1;i<=n;i++)
 36      dis[i]=maxn;
 37     dis[1]=0; 
 38     vis[1]=1;
 39     queue<int>q;
 40     q.push(1);
 41    //printf("%d\n",dis[2]);
 42     while(!q.empty())
 43     {
 44         int i;
 45         int temp = q.front();
 46         q.pop();
 47         vis[temp]=0;
 48     
 49     
 50         for(i=head[temp];i!=-1;i=map1[i].next)
 51         {
 52             
 53             int u = map1[i].end;
 54         //    printf("%d %d %d",u,dis[u],dis[temp]+map1[i].v);
 55             if(dis[u]>dis[temp]+map1[i].v)
 56             {
 57                 dis[u]=dis[temp]+map1[i].v;
 58         //        printf("%d %d %d %d %d\n",dis[u],dis[temp],map1[i].v,u,temp);
 59         //        getch();
 60                 //printf("%d %d\n",i,map1[i].v);
 61                 if(!vis[u])
 62                 {
 63                     q.push(u);
 64                     vis[u]=1;
 65                 }
 66             }
 67         }
 68     }
 69     
 70 int    ans = 0;
 71     for(i=2;i<=n;i++)
 72     {
 73     
 74         ans+=dis[i];
 75    }
 76    
 77     while(!q.empty()) q.pop();
 78     q.push(1);
 79     memset(vis,0,sizeof(vis));
 80     for(i=1;i<=n;i++)
 81      dis[i]=maxn;
 82     dis[1]=0,vis[1]=1;; 
 83     while(!q.empty())
 84     {
 85         int i;
 86         int temp = q.front();
 87         q.pop();
 88         
 89         vis[temp]=0;
 90         for(i=head1[temp];i!=-1;i=map2[i].next)
 91         {
 92         
 93             int u = map2[i].end;
 94                 //printf("%d %d %d\n",dis[u],dis[temp],map2[2].v);
 95             if(dis[u]>dis[temp]+map2[i].v)
 96             {
 97                 dis[u]=dis[temp]+map2[i].v;
 98                 if(!vis[u])
 99                 {
100                     q.push(u);
101                     vis[u]=1;
102                 }
103             }
104         }
105     } 
106   for(i=2;i<=n;i++)
107    {
108        
109     ans+=dis[i];
110    }
111   return ans;
112     
113 }
114 int main()
115 {
116     int t;
117     scanf("%d",&t);
118     while(t--)
119     {
120         count1=0,count=0;
121         memset(head,-1,sizeof(head));
122         memset(head1,-1,sizeof(head1));
123         int  m;
124         scanf("%d %d",&n,&m);
125         while(m--)
126         {
127             int x, y, z;
128             scanf("%d %d %d",&x,&y,&z);
129             add(x,y,z);
130             add1(y,x,z);
131             
132             
133         }
134         printf("%d\n",spaf());
135     
136     }
137     return 0;
138 }

 

 

posted on 2012-10-13 06:36  acmer_acm  阅读(224)  评论(0编辑  收藏  举报