C
Time Limit: 7000ms Memory limit: 65536K 有疑问?点这里^_^
题目描述
给出一个带权无向图,包含n个点,m条边。求出s,e的最短路。保证最短路存在。
输入
多组输入。
对于每组数据。
第一行输入n,m(1<= n && n<=5*10^5,1 <= m && m <= 2*10^6)。
接下来m行,每行三个整数,u,v,w,表示u,v之间有一条权值为w(w >= 0)的边。
最后输入s,e。
接下来m行,每行三个整数,u,v,w,表示u,v之间有一条权值为w(w >= 0)的边。
最后输入s,e。
输出
对于每组数据输出一个整数代表答案。
示例输入
3 1 1 2 3 1 2
示例输出
3
点,边都很多,要注意范围,数组开小了,错了好几遍,sad。。。
SPFA
#include <iostream> #include <stdlib.h> #include <queue> #include <cstring> #include <cstdio> using namespace std; const int MAX = 9999999; const int N = 500010; int n,m,cnt; int head[N]; int v[N],b[N]; struct node { int v,w; int next; } q[5000100]; void add(int u,int v,int w) { q[cnt].v=v; q[cnt].w=w; q[cnt].next=head[u]; head[u]=cnt++; } void SPFA(int s,int e) { memset(v,MAX,sizeof(v)); memset(b,0,sizeof(b)); b[s]=1; v[s]=0; queue<int >a; a.push(s); while(!a.empty()) { int t=a.front(); a.pop(); b[t]=0; for(int i=head[t]; i!=-1; i=q[i].next) { if(v[q[i].v] > v[t] + q[i].w) { v[q[i].v]=v[t] + q[i].w; if(!b[q[i].v]) { b[q[i].v]=1; a.push(q[i].v); } } } } printf("%d\n",v[e]); } int main() { while(~scanf("%d%d",&n,&m)) { cnt=0; memset(head,-1,sizeof(head)); for(int i=0; i<m; i++) { int u,v,w; scanf("%d%d%d",&u,&v,&w); add(u,v,w); add(v,u,w); } int s,e; scanf("%d%d",&s,&e); SPFA(s,e); } return 0; }
Bellman
#include <iostream> #include <stdlib.h> #include <queue> #include <cstring> #include <cstdio> using namespace std; const int MAX = 9999999; const int N = 500010; int n,m,cnt; int head[N]; int v[N],b[N]; struct node { int u,v,w; }q[5000010]; void add(int u,int v,int w) { q[cnt].u=u; q[cnt].v=v; q[cnt++].w=w; } void Bellman(int s,int e) { memset(v,MAX,sizeof(v)); v[s]=0; for(int i=1;i<n;i++) { int flag=1; for(int j=0;j<cnt;j++) { if(v[q[j].v] > v[q[j].u] +q[j].w) { v[q[j].v] = v[q[j].u] +q[j].w; flag=0; } } if(flag) break; } printf("%d\n",v[e]); } int main() { while(~scanf("%d%d",&n,&m)) { cnt=0; memset(head,-1,sizeof(head)); for(int i=0; i<m; i++) { int u,v,w; scanf("%d%d%d",&u,&v,&w); add(u,v,w); add(v,u,w); } int s,e; scanf("%d%d",&s,&e); Bellman(s,e); } return 0; }