https://vjudge.net/contest/246370#problem/D
题目大意是寻找从起点到终点的最短路径,嘿嘿,那么就可以明白了了嘛,这题用贪心!!!!
其实人家有自己的算法名字,但其实其中包含的还是一个贪心算法的思想,找呀找,找到当前点位连接到下一个点位的最短路径嘛,不过对于没有方向的无向图,在找的时候要反过来倒过去的找两遍
#include<cstdio>
#include<algorithm>
using namespace std;
struct edge//使用结构体存储边的信息
{
int from;
int to;
int time;
};
const int MAX_N = 100010;
edge es[MAX_N];
int n, m;
int dist[MAX_N];//算法书上都有定义,从起点到i点的最短距离
void sovle();
int main(void)
{
while(scanf("%d %d", &n, &m))
{
if((n==0)&&(m==0))
{
break;
}
for(int i = 0; i < m; i++)
{
scanf("%d %d %d", &es[i].from, &es[i].to, &es[i].time);
}
sovle();
printf("%d\n", dist[n]);
}
return 0;
}
void sovle()
{
for(int i = 1; i <= n; i++)//初始化数组dist[i]
{
dist[i] = MAX_N;
}
dist[1] = 0;//制定起点
while(1)
{
int flag = 0;
//遍历每一条边,如果这条边的信息能够使得dist[]数组的值变小
//就改变它,没有负权边的情况下,总会有那么一刻
//不存在任何一个边使得dist[]数组得到任何优化,搜索结束
for(int i = 0; i < m; i++)
{
edge e = es[i];
//第一个条件找到每一步的当前点位,第二个条件判断是否优化数组
if((dist[e.from] != MAX_N) && (dist[e.to] > dist[e.from] + e.time))
{
dist[e.to] = dist[e.from] + e.time;
flag = 1;
}
//无向图反过来再来一次
else if((dist[e.to] != MAX_N) && (dist[e.from] > dist[e.to] + e.time))
{
dist[e.from] = dist[e.to] + e.time;
flag = 1;
}
}
if(flag == 0)
{
break;
}
}
}