hdu 2544:点击打开链接
图上的最短路问题,且没有负权边而且这题数据还可以,所以求最短路的下面四种方法都可以过。
dijkstra(15MS):
#include <stdio.h>
#include <string.h>
#define MAX 0x3f3f3f
int n, m;
int map[110][110];
bool vis[110];
void init()
{
int i, j;
for(i = 0; i <= n; i++)
for(j = 0; j <= n; j++)
map[i][j] = MAX;
}
int dijkstra(int s, int e)
{
int i, j;
int dis[110];
memset(vis, 0 ,sizeof(vis));
for(i = 1; i <= n; i++)
dis[i] = map[s][i];
dis[s] = 0;
vis[s] = 1;
for(i = 1; i <= n; i++)
{//注意是1到n= = 总共n - 1次
int min = MAX;
int k;
for(j = 1; j <= n; j++)
{
if(!vis[j] && min > dis[j])
{
min = dis[j];
k = j;
}
}
vis[k] = 1;
for(j = 1; j <= n; j++)
if(!vis[j] && map[j][k] + min < dis[j])
dis[j] = map[j][k] + min;
}
return dis[e];
}
int main (void)
{
while(scanf("%d %d", &n, &m) != EOF)
{
init();
if(n == 0 && m == 0)
break;
int i, a, b, c;
for(i = 0; i < m; i++)
{
scanf("%d %d %d", &a, &b, &c);
map[a][b] = map[b][a] = c;
}
printf("%d\n", dijkstra(1, n));
}
return 0;
}
FloydL(31MS ):
#include <stdio.h>
#include <string.h>
#define MAX 0x3f3f3f3f
int map[110][110];
int n;
int solve(int s, int t)
{
int k, i ,j;
//三层循环的顺序是 中间点,起点,终点 顺序不能换 求多元多汇最短路
for(k = 1; k <= n; k++)
for(i = 1; i <= n; i++)
for(j = 1; j <= n; j++)
if(map[i][j] > map[i][k] + map[k][j])
map[i][j] = map[i][k] + map[k][j];
return map[s][t];
}
int main (void)
{
int m;
while(scanf("%d %d", &n, &m) != EOF)
{
if(n == 0 && m == 0)
break;
int i, j, a, b, c;
for(i = 0; i <= n; i++)
{
for(j = 0; j <= n; j++)
map[i][j] = MAX;
}
for(i = 0; i < m; i++)
{
scanf("%d %d %d", &a, &b, &c);
map[a][b] = map[b][a] = c;
}
printf("%d\n", solve(1, n));
}
return 0;
}
Bellman_Ford(15MS):
#include <stdio.h>
#include <string.h>
#include <queue>
using namespace std;
#define MAX 0x3f3f3f3f
struct node
{
int s, e, cost;
};
node way[10010];
int m;
int solve(int s, int n)
{
int i, j, k;
int dis[110];
//dis[i]存储i点到起点的最小值
for(i = 0; i < 110; i++)
dis[i] = MAX;
dis[s] = 0;
for(i = 0; i < n - 1; i++)
{//i控制次数,执行i - 1次
for(j = 0; j < 2 * m; j++)
{//无向图
if(dis[way[j].s] > dis[way[j].e] + way[j].cost)
dis[way[j].s] = dis[way[j].e] + way[j].cost;
}
}
return dis[n];
}
int main (void)
{
int n;
while(scanf("%d %d", &n, &m) != EOF)
{
int k = 0;
if(n == 0 && m == 0)
break;
int i, a, b, c;
for(i = 0; i < m; i++)
{
scanf("%d %d %d", &a, &b, &c);
way[i * 2].s = a;
way[i * 2].e = b;
way[i * 2].cost = c;
way[i * 2 + 1].s = b;
way[i * 2 + 1].e = a;
way[i * 2 + 1].cost = c;
}
printf("%d\n", solve(1, n));
}
return 0;
}
#include <stdio.h>
#include <string.h>
#include <queue>
using namespace std;
#define MAX 0x3f3f3f3f
int m, map[110][110];
int spfa(int s, int n)
{
queue<int> q;
int dis[110], i;
for(i = 0; i <= n; i++)
dis[i] = MAX;
dis[s] = 0;
bool vis[110];//标记是否入队列
memset(vis, 0, sizeof(vis));
q.push(s);
vis[s] = 1;
while(!q.empty())
{
int t = q.front();
q.pop();
vis[t] = 0;
for(i = 1; i <= n; i++)
{
if(map[t][i])
{
if(dis[i] > dis[t] + map[t][i])
{
dis[i] = dis[t] + map[t][i];
if(vis[i] == 0)
{//没入队列就入队列
vis[i] = 1;
q.push(i);
}
}
}
}
}
return dis[n];
}
int main (void)
{
int n;
while(scanf("%d %d", &n, &m) != EOF)
{
int k = 0;
if(n == 0 && m == 0)
break;
int i, a, b, c;
memset(map, 0, sizeof(map));
for(i = 0; i < m; i++)
{
scanf("%d %d %d", &a, &b, &c);
map[a][b] = map[b][a] = c;
}
printf("%d\n", spfa(1, n));
}
return 0;
}