您的位置:首页 > 其它

hdu 2066 一个人的旅行

2013-05-25 20:52 309 查看
数组开小了,导致一直检查也不知道哪里RE了。。。。

因为起点和终点都不唯一,所以增加两个虚拟的起点和终点0和n+1,DIJ()求得0和n+1之间的最短路

#include <stdlib.h>

#include <string.h>

#include <stdio.h>

#include <ctype.h>

#include <math.h>

#include <stack>

#include <queue>

#include <map>

#include <set>

#include <vector>

#include <string>

#include <iostream>

#include <algorithm>

using namespace std;

#define ll long long

#define ls rt<<1

#define rs ls1

#define lson l,mid,ls

#define rson mid+1,r,rs

#define middle (l+r)>>1

#define eps (1e-9)

#define type int

#define clr_all(x,c) memset(x,c,sizeof(x))

#define clr(x,c,n) memset(x,c,sizeof(x[0])*(n+1))

#define MOD 1000000007

#define inf 0x3f3f3f3f

#define pi acos(-1.0)

#define M 1000+10

int mp[M][M],d[M],fn[M];

int ss,dd;

void Init(){

int i,j;

for(i=0;i<M;i++){

for(j=0;j<M;j++)mp[i][j]=inf;

fn[i]=0;

d[i]=inf;

}

}

int Dij(){

int i,j,minx,k;

d[ss]=0;fn[0]=1;

for(i=1;i<=dd;i++){

minx=inf;k=0;

for(j=0;j<=dd;++j)

if(fn[j]==0&&d[j]<minx){

minx=d[j];k=j;

}

fn[k]=1;

for(j=0;j<=dd;j++)

if(fn[j]==0&&(d[k]+mp[k][j])<d[j]){

d[j]=d[k]+mp[k][j];

}

}

return d[dd];

}

int main(){

int T,s,d,i,j,x,y,z,n;

while(~scanf("%d %d %d",&T,&s,&d)){

Init(); n=0;

while(T--){

scanf("%d %d %d",&x,&y,&z);

if(mp[x][y]>z)mp[x][y]=mp[y][x]=z;

if(x>n)n=x;

if(y>n)n=y;

}

while(s--){

scanf("%d",&x);

mp[0][x]=mp[x][0]=0;

}

while(d--){

scanf("%d",&x);

mp[x][n+1]=mp[n+1][x]=0;

}

ss=0,dd=n+1;

x=Dij();

printf("%d\n",x);

}

return 0;

}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: