SPFA--P3905 道路重建

破坏掉一些路径,修复他的代价就是该路径的长度,没有破坏的路径,修复它的代价是0(*链式前向星建图)

SPFA求最短路:

 1 #include <cstdio>
 2 #include <iostream>
 3 #include <algorithm>
 4 #include <cmath>
 5 #include <queue>
 6 using namespace std;
 7 int n,m,d;
 8 int a,b;
 9 int x,y;
10 int dis[10000];
11 bool vis[10000];
12 bool mark[1000][1000];
13 struct node
14 {
15     int x,y,w;
16 }edge[10000];
17 struct ask
18 {
19     int w;
20     int to;
21     int next;
22 }ed[10000];
23 int head [10000];
24 int tot =0;
25 void add (int u,int v,int w)
26     {
27       ed[++tot].w=w;
28       ed[tot].to=v;
29       ed[tot].next=head[u];
30       head[u]=tot;
31 }
32 void SPFA(int s)
33 {
34       queue<int> q;
35         for(int i=1;i<=n;i++){//初始化, 
36             dis[i]=0x7fffffff;
37             vis[i]=0;
38         }
39         q.push(s);//放入起点 
40         dis[s]=0;//自己到自己为0; 
41         vis[s]=1;
42         while(!q.empty()){ 
43             int u=q.front();
44             q.pop();vis[u]=0;//弹出队首 
45             for(int i=head[u];i;i=ed[i].next){
46                 int v=ed[i].to;

48 if(dis[v]>dis[u]+ed[i].w){ 49 dis[v]=dis[u]+ed[i].w; 50 if(!vis[v]){ 51 vis[v]=1; 52 q.push(v);//重新放入; 53 } 54 } 55 } 56 } 57 } 58 int main() 59 { 60 scanf ("%d",&n); 61 scanf ("%d",&m); 62 for (int i = 1;i <= m;i++) 63 { 64 scanf ("%d%d%d",&edge[i].x,&edge[i].y,&edge[i].w); 65 } 66 scanf ("%d",&d); 67 for (int i = 1;i <= d;i++) 68 { 69 scanf ("%d%d",&x,&y); 70 mark[x][y]=1; 71 mark[y][x]=1; 72 } 73 scanf ("%d%d",&a,&b); 74 for (int i = 1;i <= m;i++) 75 { 76 if (mark[edge[i].x][edge[i].y]==1) 77 { 78 add(edge[i].x,edge[i].y,edge[i].w); 79 add(edge[i].y,edge[i].x,edge[i].w); 80 } 81 else 82 { 83 add(edge[i].x,edge[i].y,0); 84 add(edge[i].y,edge[i].x,0); 85 } 86 } 87 SPFA(a); 88 cout<<dis[b]<<endl; 89 return 0; 90 }
原文地址:https://www.cnblogs.com/very-beginning/p/12294522.html