Problem Description
给定一个带权无向图,求节点1到节点n的最短路径。
Input
输入包含多组数据,格式如下。
第一行包括两个整数n m,代表节点个数和边的个数。(n<=100)
剩下m行每行3个正整数a b c,代表节点a和节点b之间有一条边,权值为c。
Output
每组输出占一行,仅输出从1到n的最短路径权值。(保证最短路径存在)
Sample Input
3 2
1 2 1
1 3 1
1 0
Sample Output
1
0
Hint
Source
赵利强
弗洛伊德:
#include <iostream>
#include <bits/stdc++.h>
#define MAXN 1000000
using namespace std;
int mp[210][210];
int vis[210];
int n,m;
void f()
{
for(int k = 1;k<=n;k++)
{
for(int i = 1;i<n;i++)
{
for(int j = 1;j<=n;j++)
{
if(mp[i][j]>(mp[i][k]+mp[k][j]))
{
mp[i][j] = mp[i][k] + mp[k][j];
}
}
}
}
}
int main()
{
int i, j;
while(scanf("%d %d",&n,&m)!=EOF)
{
int a, b, c;
for(i = 1;i<=n;i++)
{
for(j = 1;j<=n;j++)
{
if(i==j)
{
mp[i][j] = 0;
}
else
mp[i][j] = MAXN;
}
}
for(i = 0;i<m;i++)
{
scanf("%d %d %d",&a, &b,&c);
if(mp[a][b]>c)
mp[a][b] = mp[b][a] = c;
}
f();
printf("%d\n",mp[1][n]);
}
return 0;
}
/***************************************************
Result: Accepted
Take time: 28ms
Take Memory: 280KB
****************************************************/
Dijkstra
#include <iostream>
#include <bits/stdc++.h>
#define MAXN 1000000
using namespace std;
int mp[120][120], vis[120], dis[120];
int n, m;
void dij(int v)
{
int i, j;
for(i = 1;i<=n;i++)
{
dis[i] = mp[v][i];
}
dis[v] = 0;
vis[v] = 1;
for(i = 0;i<n-1;i++)
{
int mini = MAXN, u = v;
for(j = 1;j<=n;j++)
{
if(dis[j]<mini&&vis[j]==0)
{
mini = dis[j];
u = j;
}
}
vis[u] = 1;
for(j = 1;j<=n;j++)
{
if(dis[j]>dis[u]+mp[u][j]&&dis[j]<MAXN&&!vis[j])
{
dis[j] = dis[u]+mp[u][j];
}
}
}
}
int main()
{
int i, j;
while(scanf("%d %d",&n,&m)!=EOF)
{
for(i = 1; i<=n; i++)
{
for(j = 1; j<=n; j++)
{
if(i==j)
mp[i][j] = 0;
else
mp[i][j] = MAXN;
}
}
for(i = 0; i<m; i++)
{
int a, b, c;
scanf("%d %d %d",&a, &b,&c);
if(mp[a][b]>c)
mp[a][b] = mp[b][a] = c;
}
if(m==0)
printf("0\n");
else
{
memset(vis, 0, sizeof(vis));
dij(1);
printf("%d\n",dis[n]);
}
}
return 0;
}
/***************************************************
Result: Accepted
Take time: 12ms
Take Memory: 240KB
****************************************************/