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 }