C–最短路
Problem Description
给出一个带权无向图,包含n个点,m条边。求出s,e的最短路。保证最短路存在。
Input
多组输入。
对于每组数据。
第一行输入n,m(1<= n && n<=510^5,1 <= m && m <= 210^6)。
接下来m行,每行三个整数,u,v,w,表示u,v之间有一条权值为w(w >= 0)的边。
最后输入s,e。
Output
对于每组数据输出一个整数代表答案。
Sample Input
3 1
1 2 3
1 2
Sample Output
3
(由于此题数足量比较大,所以用最短路做法不成)
代码一为简单做法
代码二为图的遍历做法(用时较长)(此方法为前向星+spfa 做法)(小编不懂呢!)
1、
#include <iostream>
#include <bits/stdc++.h>
#define inf 0x3f3f3f3f
using namespace std;
struct node
{
int u,v,w;
}a[5000010];
int top;
int disv[5000000];
int x,y;
void biu(int u,int v,int w)
{
a[top].u=u;
a[top].v=v;
a[top].w=w;
top++;
}
void bigboom(int g,int h)
{
int i,j;
int check;
memset(disv,inf,sizeof(disv));
disv[g]=0;
for(i=1; i<x; i++)
{
check=0;
for(j=1; j<top; j++)
{
if(disv[a[j].u]>disv[a[j].v]+a[j].w)
{
disv[a[j].u]=disv[a[j].v]+a[j].w;
check=1;
}
}
if(check==0)
{
break;
}
}
cout << disv[h] << endl;
}
int main()
{
while(cin >> x >> y)
{
top=1;
int u,v,w,c,d;
while(y--)
{
cin >> u >> v >> w;
biu(u,v,w);
biu(v,u,w);
}
cin >> c >> d;
bigboom(c,d);
}
return 0;
}
2、
#include<bits/stdc++.h>
#define Maxn 0x3f3f3f3f
using namespace std;
int n, m, cnt;
int vis[500010], dis[500010],head[500010];
struct node
{
int v, w;
int next;
}edge[4000010];
void add(int u, int v, int w)
{
edge[cnt].v = v;
edge[cnt].w = w;
edge[cnt].next = head[u];
head[u] = cnt++;
}
void spfa(int s, int e)
{
queue<int>q;
memset(vis,0,sizeof(vis));
for(int i = 1; i <= n; i++)
dis[i] = Maxn;
dis[s] = 0;
vis[s] = 1;
q.push(s);
while(!q.empty())
{
int k = q.front();
q.pop();
vis[k] = 0;
for(int i = head[k]; i != -1; i = edge[i].next)
{
int v = edge[i].v;
if(dis[v] > dis[k] + edge[i].w)
{
dis[v] = dis[k] + edge[i].w;
if(!vis[v])
{
vis[v] = 1;
q.push(v);
}
}
}
}
}
int main()
{
while(cin >> n >> m)
{
memset(head,-1,sizeof(head));
cnt = 0;
while(m--)
{
int u, v, w;
cin >> u >> v >> w;
add(u,v,w);
add(v,u,w);
}
int s, e;
cin >> s >> e;
spfa(s,e);
cout << dis[e] << endl;
}
return 0;
}```