您的位置:首页 > 其它

HDU3790 最短路径问题

2012-12-02 12:09 411 查看
#include<stdio.h>
#include<string.h>
#define MAX 0x7ffffff
struct G {
int d;
int p;
}map[1001][1001];
struct D {
int d;
int p;
}dist[1001];
bool vis[1001];
int m,n,s,e;
void dijkstra()
{
int i,j,k,min;
for(i=1;i<n;i++){
for(min=MAX,j=1;j<=n;j++){
if(!vis[j]&&min>dist[j].d){
min=dist[j].d;
k=j;
}
}
vis[k]=1;
for(j=1;j<=n;j++){
if(!vis[j]){
if(dist[j].d>dist[k].d+map[k][j].d){
dist[j].d=dist[k].d+map[k][j].d;
dist[j].p=dist[k].p+map[k][j].p;
}else if(dist[j].d==dist[k].d+map[k][j].d&&dist[j].p>dist[k].p+map[k][j].p){
dist[j].p=dist[k].p+map[k][j].p;
}
}
}
}
printf("%d %d\n",dist[e].d,dist[e].p);
}
void init()
{
int i,j;
int a,b,d,p;
for(i=1;i<=n;i++){
for(j=1;j<=n;j++){
map[i][j].d=map[j][i].d=MAX;
map[i][j].p=map[j][i].p=MAX;
}
map[i][i].d=map[i][i].p=0;
}
for(i=0;i<m;i++) {
scanf("%d%d%d%d",&a,&b,&d,&p);
if(map[a][b].d>d){
map[a][b].d=map[b][a].d=d;
map[a][b].p=map[b][a].p=p;
}else if(map[a][b].d==d&&map[a][b].p>p){
map[a][b].p=map[b][a].p=p;
}
}
scanf("%d%d",&s,&e);
for(i=1;i<=n;i++){
dist[i].d=map[s][i].d;
dist[i].p=map[s][i].p;
}
memset(vis,0,sizeof(vis));
vis[s]=1;
dist[s].d=dist[s].p=0;
}
int main()
{
while(scanf("%d%d",&n,&m),n||m){
init();
dijkstra();
}
return 0;
}


我用dijkstra做的,还可以用其他方法去做!如:SPFA
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: