一本通 3.2 练习 7」道路和航线
又水又坑的一题,
spfa裸题,但要加deque优化,用堆都不行。。
题目描述
输入格式
输出格式
样例
数据范围与提示
1 #include<bits/stdc++.h> 2 using namespace std; 3 const int maxm = 1e5; 4 const int maxn = 5e4; 5 6 struct edge{ 7 int v,nex,w; 8 }e[maxm<<1]; 9 10 int head[maxn],n,m1,m2,s,dis[maxn],vis[maxn],size; 11 12 void adde(int u,int v,int w){ 13 e[size].v=v;e[size].w=w;e[size].nex=head[u];head[u]=size++; 14 } 15 16 void spfa(){ 17 deque<int> q;q.push_back(s);dis[s]=0; 18 while(!q.empty()){ 19 int u=q.front();q.pop_front();vis[u]=0; 20 for(int i=head[u];~i;i=e[i].nex){ 21 int v=e[i].v; 22 if(dis[v]>dis[u]+e[i].w) { 23 dis[v]=dis[u]+e[i].w; 24 if(!vis[v]){ 25 if(!q.empty()&&dis[v]<dis[q.front()]) q.push_front(v); 26 else q.push_back(v);vis[v]=1; 27 } 28 } 29 } 30 } 31 } 32 33 int main(){ 34 scanf("%d%d%d%d",&n,&m1,&m2,&s); 35 memset(head,-1,sizeof(head)); 36 for(int i=1;i<=m1;i++){ 37 int u,v,w;scanf("%d%d%d",&u,&v,&w);adde(u,v,w);adde(v,u,w); 38 } 39 for(int i=1;i<=m2;i++){ 40 int u,v,w;scanf("%d%d%d",&u,&v,&w);adde(u,v,w); 41 } 42 memset(dis,0x3f,sizeof(dis)); 43 spfa(); 44 for(int i=1;i<=n;i++){ 45 if(dis[i]==0x3f3f3f3f) printf("NO PATH\n"); 46 else printf("%d\n",dis[i]); 47 } 48 return 0; 49 }