图结构练习——最短路径
图结构练习——最短路径
Time Limit: 1000 msMemory Limit: 65536 KiB
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>
using namespace std;
#define INF 0x3f3f3f
int main()
{
int n,m,a,b,c,graph[105][105];
int d[105][105];
while(cin>>n>>m)
{
for(int i=0; i<=105; i++)
{
for(int j=0; j<=105; j++)
{
if(i==j)
graph[i][j]=0;
else
graph[i][j]=INF;
}
}
for(int i=1; i<=m; i++)
{
cin>>a>>b>>c;
if(c<graph[a][b])
graph[a][b]=graph[b][a]=c;
}
for(int i=1; i<=n; i++)
for(int j=1; j<=n; j++)
d[i][j]=graph[i][j];
for(int k=1; k<=n; k++)
for(int i=1; i<=n; i++)
{
for(int j=1; j<=n; j++)
{
if(d[i][j]>d[i][k]+d[k][j])
d[i][j]=d[i][k]+d[k][j];
}
}
cout<<d[1][n]<<endl;
}
return 0;
}
迪杰斯特拉算法
#include <iostream>
#include <bits/stdc++.h>
using namespace std;
#define INF 0x3f3f3f
int main()
{
int n,m,a,b,c,k;
int graph[105][105],path[105],book[105];
while(cin>>n>>m)
{
memset(book,0,sizeof(book));
for(int i=0; i<105; i++)
for(int j=0; j<105; j++)
{
if(i==j)
graph[i][j]=0;
else
graph[i][j]=INF;
}
for(int i=1; i<=m; i++)
{
cin>>a>>b>>c;
if(graph[a][b]>c)
graph[a][b]=graph[b][a]=c;
}
for(int i=1; i<=n; i++)
path[i]=graph[1][i];
book[1]=1;
for(int i=1;i<=n;i++)
{
int Min=INF;
for(int j=1;j<=n;j++)
{
if(!book[j]&&path[j]<Min)
{
k=j;
Min=path[j];
}
}
book[k]=1;
for(int j=1;j<=n;j++)
{
if(!book[j]&&graph[k][j]<INF)
{
if(path[j]>path[k]+graph[k][j])
path[j]=path[k]+graph[k][j];
}
}
}
cout<<path[n]<<endl;
}
return 0;
}a和b之间不只有一条边,需要选取最小的那条。

浙公网安备 33010602011771号