题目:
链接:点击打开链接
题意:
思路:
代码:
//Dijkstra算法版
#include <iostream>
#include <cstdio>
#include <cstring>
using namespace std;
#define INF 100000000
const int N = 110;
int n,m;
int a,b,c;
int w[N][N],dis[N];
void dijkstra()
{
int vis[N];
memset(vis,0,sizeof(vis));
for(int i=1; i<=n; i++)
{
dis[i] = w[1][i];
}
for(int i=1; i<n; i++)
{
int x,m = INF;
for(int y=1; y<=n; y++)
{
if(!vis[y] && dis[y] <= m)
m = dis[x=y];
}
if(m == INF)
return ;
vis[x] = 1;
for(int y=1; y<=n; y++)
{
if(dis[y] > dis[x] + w[x][y])
dis[y] = dis[x] + w[x][y];
}
}
}
int main()
{
//freopen("input.txt","r",stdin);
while(scanf("%d%d",&n,&m) != EOF && (n || m))
{
for(int i=1; i<=n; i++)
{
for(int j=1; j<=n; j++)
w[i][j] = INF;
}
for(int i=1; i<=m; i++)
{
scanf("%d%d%d",&a,&b,&c);
w[a][b] = w[b][a] = c;
}
dijkstra();
printf("%d\n",dis[n]);
}
return 0;
}
----------------------------------------------------------------------------------------
//Floyd算法版
#include <iostream>
#include <cstdio>
#include <cstring>
using namespace std;
#define INF 100000000
const int N = 110;
int n,m;
int a,b,c;
int dis[N][N];
void floyd()
{
for(int k=1; k<=n; k++)
{
for(int i=1; i<=n; i++)
{
for(int j=1; j<=n; j++)
{
if(dis[i][j] > dis[i][k] + dis[k][j])
dis[i][j] = dis[i][k] + dis[k][j];
}
}
}
}
int main()
{
//freopen("input.txt","r",stdin);
while(scanf("%d%d",&n,&m) != EOF && (n || m))
{
for(int i=1; i<=n; i++)
{
for(int j=1; j<=n; j++)
dis[i][j] = INF;
}
for(int i=1; i<=m; i++)
{
scanf("%d%d%d",&a,&b,&c);
dis[a][b] = dis[b][a] = c;
}
floyd();
printf("%d\n",dis[1][n]);
}
return 0;
}
---------------------------------------------------------------------------
战斗,从不退缩;奋斗,永不停歇~~~~~~~~~~~~~~~~~~~~~