|
本帖最后由 diggersun 于 2016-3-9 15:19 编辑
经典的贪心方法,或者叫启发式广度优先搜索,尽管现在人们更喜欢SPFA,但是还是了解一下它吧。TYVJ1031 热浪,经典的题目,我的做法:
- #include <iostream>
- using namespace std;
- int g[2600][2600];
- bool flag[2600];
- int rount[2600];
- int T, C, Ts, Te, rs, re, ci;
- int FindMin()//找所有的未标号的顶点中路径的最小值
- {
- int Min,Temp,i;
- Min=999999999;
- for (i=1; i<=T; i++)
- if ((!flag[i]) &&(rount[i]<Min))
- {
- Temp=i;
- Min=rount[i];
- }
- return Temp;
- }
- int main()
- {
- int i,j,k;
- int shortest;
- cin >> T >> C >> Ts >> Te;
- for (i=1; i<=T; i++)
- {
- rount[i]=999999999;
- for (j=i; j<=T; j++)
- g[i][j]=g[j][i]=999999999;
- }
- for (i = 1; i <= C; i++)
- {
- cin >> rs >> re >> ci;
- if (ci<g[rs][re]) g[rs][re]= g[re][rs] = ci;
- }
- flag[Ts]=1;
- i=Ts;//从第一顶点开始
- rount[i]=0;
- do
- {
- shortest=99999999;
- for (j=1; j<=T; j++)
- if (!flag[j]) //本点没有被标号
- if (rount[j]>rount[i]+g[i][j])
- rount[j]=rount[i]+g[i][j];
- i=FindMin();
- flag[i]=1;
- }
- while (!flag[Te]);
- cout<<rount[Te];
- return 0;
- }
复制代码
|
|