Problem Description
在每年的校赛里,所有进入决赛的同学都会获得一件很漂亮的t-shirt。但是每当我们的工作人员把上百件的衣服从商店运回到赛场的时候,却是非常累的!所以现在他们想要寻找最短的从商店到赛场的路线,你可以帮助他们吗?
Input
输入包括多组数据。每组数据第一行是两个整数N、M(N<=100,M<=10000),N表示成都的大街上有几个路口,标号为1的路口是商店所在地,标号为N的路口是赛场所在地,M则表示在成都有几条路。N=M=0表示输入结束。接下来M行,每行包括3个整数A,B,C(1<=A,B<=N,1<=C<=1000),表示在路口A与路口B之间有一条路,我们的工作人员需要C分钟的时间走过这条路。
输入保证至少存在1条商店到赛场的路线。
输入保证至少存在1条商店到赛场的路线。
Output
对于每组输入,输出一行,表示工作人员从商店走到赛场的最短时间
Sample Input
2 1 1 2 3 3 3 1 2 5 2 3 5 3 1 2 0 0
View Code
#include<stdio.h> #include<string.h> #include<queue> using namespace std; #define N 110 #define inf 0x7ffffff typedef struct node { int to; struct node* next; int w; }node,*pnode; node side[N]; typedef struct heap { bool operator < (heap T)const { return T.dis<dis; } int x,dis; }heap; priority_queue<heap>que; int v[N]; int len,d[N],n,m; void add(int a,int b,int c) { pnode p,q; p=&side[a]; while(p->next!=NULL) p=p->next; q=new node(); q->to=b; q->next=NULL; q->w=c; p->next=q; } int dijkstra() { heap min,in; pnode p; while(!que.empty()) que.pop(); in.x=1; in.dis=0; d[1]=0; que.push(in); while(!que.empty()) { min=que.top(); que.pop(); if(min.x==n) return min.dis; if(v[min.x]) continue; v[min.x]=1; p=side[min.x].next; while(p!=NULL) { if(!v[p->to]) { in.x=p->to; in.dis=min.dis+p->w; if(in.dis<d[in.x]) { d[in.x]=in.dis; que.push(in); } } p=p->next; } } return -1; } int main() { int i,a,b,c,min; while(scanf("%d%d",&n,&m),n||m) { for(i=1,len=0;i<=n;i++) { side[i].next=NULL; v[i]=0; d[i]=inf; } while(m--) { scanf("%d%d%d",&a,&b,&c); add(a,b,c); add(b,a,c); } min=dijkstra(); printf("%d\n",min); } return 0; }
普通的邻接表:
View Code
#include<stdio.h> #include<string.h> #define INF 0x1f1f1f int dis[102]; struct node { int from,to,w,next; }q[10002]; int head[10002]; int tot; void add(int s,int u,int wi) { q[tot].to=u; q[tot].w=wi; q[tot].next=head[s]; head[s]=tot++; } int n; void dijkstra() { int s[101]; int u,i,j,x,k; memset(s,0,sizeof(s)); for(i=head[1];i;i=q[i].next) { k=q[i].to; dis[k]=q[i].w; } s[1]=1; dis[1]=0; for(i=2;i<=n;i++) { u=1; x=INF; for(j=1;j<=n;j++) if(!s[j]&&dis[j]<x) { u=j; x=dis[j]; } s[u]=1; for(j=head[u];j;j=q[j].next) { k=q[j].to; if(q[j].w<INF&&dis[u]+q[j].w<dis[k]) dis[k]=dis[u]+q[j].w; } } } int main() { int a,b,c,i,m; while(scanf("%d%d",&n,&m),n&&m) { tot=1; memset(head,0,sizeof(head)); memset(dis,INF,sizeof(dis)); for(i=0;i<m;i++) { scanf("%d%d%d",&a,&b,&c); add(a,b,c); add(b,a,c); } dijkstra(); printf("%d\n",dis[n]); } return 0; }