题目大意:对于中文题 没有什么可以说的 就是给个n个点 m个道路 求从某点到某点的最短路径
解题思路:标准的最短路径的模板 因为数据量较小 所以每种算法都可以过。下面我就贴上我过了得代码
Floyd算法
Memoey 1772
Time 62
#include <iostream>
#include <cstdio>
#include <cstring>
#include <cstdlib>
#include <algorithm>
#include <map>
#include <cmath>
#include <queue>
#include <string>
#include <vector>
#include <set>
using namespace std;
#define ll long long
#define sc(x) scanf("%d",&x)
#define dsc(x,y) scanf("%d%d",&x,&y)
#define sssc(x) scanf("%s",s)
#define sdsc(x,y) scanf("%s %s",x,y)
#define ssc(x,y,z) scanf("%d%d%d",&x,&y,&z)
#define pr(x) printf("%d\n",x)
#define FOR(i,n,o) for(int i=o;i<=n;i++)
#define lcr(a,b) memset(a,b,sizeof(a))
#define Inf 1<<29
int n,m;
int mp[100][100];
int main()
{
while(~dsc(n,m))
{
FOR(i,n,1)
{
FOR(j,n,1)
{
if(i!=j)
{
mp[i][j]=Inf;
}
else
{
mp[i][j]=0;
}
}
}
FOR(i,m,1)
{
int a,b,c;
sc(a);
a++;
sc(b);
b++;
sc(c);
mp[a][b]=min(mp[a][b],c);//注意里 有可能给你输入a b 相同 距离不同
mp[b][a]=mp[a][b];
}
FOR(k,n,1)
{
FOR(i,n,1)
{
FOR(j,n,1)
{
if(i!=j&&j!=k)
{
mp[i][j]=min(mp[i][j],mp[i][k]+mp[k][j]);
}
}
}
}
int t,w;
dsc(t,w);
if(mp[t+1][w+1]==Inf)
puts("-1");
else
pr(mp[t+1][w+1]);
}
return 0;
}
Dijkstra算法
#include <iostream>
#include <cstdio>
#include <cstring>
#include <cstdlib>
#include <algorithm>
#include <map>
#include <cmath>
#include <queue>
#include <string>
#include <vector>
#include <set>
using namespace std;
#define ll long long
#define sc(x) scanf("%d",&x)
#define dsc(x,y) scanf("%d%d",&x,&y)
#define sssc(x) scanf("%s",s)
#define sdsc(x,y) scanf("%s %s",x,y)
#define ssc(x,y,z) scanf("%d%d%d",&x,&y,&z)
#define pr(x) printf("%d\n",x)
#define FOR(i,n,o) for(int i=o;i<=n;i++)
#define lcr(a,b) memset(a,b,sizeof(a))
#define Inf 1<<29
int mp[205][205];
int dis[205];
int vis[205];
int n,m;
void dij(int s)
{
FOR(i,n,1)
{
vis[i]=0;
dis[i]=mp[s][i];
}
vis[s]=1;
dis[s]=0;
FOR(i,n,1)
{
int to=-1;
int d=Inf;
FOR(j,n,1)
{
if(!vis[j]&&d>dis[j])
{
d=dis[j];
to=j;
}
}
if(d==Inf)
break;
vis[to]=1;
FOR(j,n,1)
{
if(!vis[j]&&dis[j]>dis[to]+mp[to][j])
dis[j]=dis[to]+mp[to][j];
}
}
return ;
}
int main()
{
while(~dsc(n,m))
{
lcr(mp,0);
FOR(i,n,1)
{
FOR(j,n,1)
{
mp[i][j]=Inf;
}
}
FOR(i,m,1)
{
int a,b,c;
ssc(a,b,c);
a++,b++;
if(mp[a][b]>c)
mp[a][b]=mp[b][a]=c;
}
int a,b;
dsc(a,b);
dij(a+1);
if(dis[b+1]==Inf)
puts("-1");
else
pr(dis[b+1]);
}
return 0;
}
Bellman-Ford(贝尔曼)算法
#include <iostream>
#include <cstdio>
#include <cstring>
#include <cstdlib>
#include <algorithm>
#include <map>
#include <cmath>
#include <queue>
#include <string>
#include <vector>
#include <set>
using namespace std;
#define ll long long
#define sc(x) scanf("%d",&x)
#define dsc(x,y) scanf("%d%d",&x,&y)
#define sssc(x) scanf("%s",s)
#define sdsc(x,y) scanf("%s %s",x,y)
#define ssc(x,y,z) scanf("%d%d%d",&x,&y,&z)
#define pr(x) printf("%d\n",x)
#define FOR(i,n,o) for(int i=o;i<=n;i++)
#define lcr(a,b) memset(a,b,sizeof(a))
#define Inf 1<<29
int dis[206];
int vis[205];
struct node
{
int u;
int v;
int w;
}q[205*205];
int n,m;
void bellman_floyd(int s)
{
FOR(i,n,0)
{
dis[i]=Inf;
}
dis[s]=0;
FOR(i,n,1)
{
for(int j=1;j<=2*m+1;j++)
{
if(dis[q[j].u]+q[j].w<dis[q[j].v])
dis[q[j].v]=dis[q[j].u]+q[j].w;
}
}
return ;
}
int main()
{
while(~dsc(n,m))
{
for(int i=1;i<=2*m;i+=2)
{
ssc(q[i].u,q[i].v,q[i].w);
q[i+1].v=q[i].u;
q[i+1].u=q[i].v;
q[i+1].w=q[i].w;
}
int t,w;
dsc(t,w);
bellman_floyd(t);
if(dis[w]==Inf)
puts("-1");
else
pr(dis[w]);
}
return 0;
}
END!!!!!!!!!!!!!!!!!!!!!!!!