您的位置:首页 > 其它

HDOJ 2544 最短路

2012-03-25 14:42 417 查看
第一次用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 200
int 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
<<endl;
//cout << "源点到最后一个顶点的路径为: ";
//search(1, n, prve);
}
//system("pause");
return 0;
}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: