HDOJ 2544 最短路

来源:互联网 发布:iphone6s手机壳知乎 编辑:程序博客网 时间:2024/06/05 07:28

第一次用dijkstra .感觉就是动态规划啊,先找出当前图的最小距离,加入当前结点。在在此节点的基础上更新新的距离,其实真正理解了也是很好想的,刚开始数组地图开的小了map[100][100], 结果WA 了,数组开大点就好。

#include<cstdio>#include<cstdlib>#include<iostream>#include<algorithm>#include<vector>#include<cstring>using namespace std;#define maxint 100000#define maxsize 200int map[maxsize][maxsize];int dist[maxsize], prve[maxsize];int n;void dijkstra(int n, int v, int *dist, int *prve, int map[maxsize][maxsize]){   bool s[maxsize];   for(int i=1; i<=n; i++)   {     dist[i]= map[v][i];     s[i] = false;     if(dist[i]==maxint)     prve[i] = 0;     else prve[i] = v;   }   s[v]=1;   dist[v] = 0;   for(int i=2; i<=n; i++)   {     int temp = maxint;     int u = v;     for(int j=1; j<=n; j++)     if(!s[j]&&dist[j]<temp)     {       temp = dist[j];       u = j;     }      s[u] = true;     for(int j=1; j<=n; j++)     if(!s[j]&&dist[j]>dist[u]+map[j][u])     {     dist[j] = dist[u]+map[j][u];     prve[j] = u;     }   }}//查找路径 int search(int v, int u, int *prve){    int q[maxsize];    int tot =1;    q[tot] = u;    int temp = prve[u];    while(temp!=v)    {        q[tot]=temp;        tot++;        temp = prve[temp];    }    q[tot] = v;    for(int i=tot; i>=1; i--)    {      if(i!=1)      cout<<q[i]<<"->";      else       cout<<q[i]<<endl;    }}int main(){    //freopen("input.txt","r",stdin);    int n,line;    while(cin>>n>>line)    {     if(!n&&!line)break;      int v, u, w;      for(int i=1; i<=n; i++)      for(int j=1; j<=n; j++)      map[i][j] = maxint;      while(line--)      {       cin>>v>>u>>w;       map[v][u] = w;       map[u][v] = w;      }      for(int i=1; i<=n; i++)      dist[i] = maxint;      dijkstra(n, 1, dist, prve, map);      cout<<dist[n]<<endl;     //cout << "源点到最后一个顶点的路径为: ";    //search(1, n, prve);   }   //system("pause");   return 0;}


原创粉丝点击