dijkstra 的表形式
节点大的时候使用
节点大的时候使用
- #include <iostream>
- using namespace std;
- #define N 1000
- #define inf 100000000
- struct Eage
- {
- int a,b,len;
- }e[4*N];
- int d[N],pre[N],n,t;bool v[N];
- void dijkstra()
- {
- int i,j,k;
- for(i=0;i<n;i++)d[i]=inf,pre[i]=-1,v[i]=false;d[0]=0;
- for(i=0;i<n;i++)
- {
- for(j=0,k=-1;j<t;j++)//先找出目前距离最小的.贪心
- {
- if(!v[e[j].a]&&(k==-1||d[e[j].a]<d[k]))k=e[j].a;
- if(!v[e[j].b]&&(k==-1||d[e[j].b]<d[k]))k=e[j].b;
- }
- for(v[k]=true,j=0;j<t;j++)//开始,对于未访问的点才pre
- {
- if(k==e[j].a&&!v[e[j].b]&&d[e[j].a]+e[j].len<d[e[j].b])d[e[j].b]=d[e[j].a]+e[j].len,pre[e[j].b]=k;
- if(k==e[j].b&&!v[e[j].a]&&d[e[j].b]+e[j].len<d[e[j].a])d[e[j].a]=d[e[j].b]+e[j].len,pre[e[j].a]=k;
- }
- }
- }
- int main()
- {
- int i,x,y,len;
- while(scanf("%d%d",&t,&n)!=EOF)
- {
- t<<=1;
- for(i=0;i<t;i+=2)
- {
- scanf("%d%d%d",&x,&y,&len);x--;y--;
- e[i].a=x;e[i].b=y;e[i].len=len;
- e[i+1].a=y;e[i+1].b=x;e[i+1].len=len;
- }
- dijkstra();
- printf("%d/n",d[n-1]);
- }
- return 0;
- }