HDU 3665 最短路 floyd
http://acm.hdu.edu.cn/showproblem.php?pid=3665
最短路
代码(spfa)
#include<iostream> #include<cstdio> #include<string> #include<cstring> #define nMAX 12 #define inf 1<<30 using namespace std; int vs[nMAX],head[nMAX],dis[nMAX],sea[nMAX],qu[nMAX]; int n,s_edge; struct Edge { int u,v,w,nxt; }edge[nMAX*12*2]; void addedge(int u,int v,int w) { edge[++s_edge].v=v; edge[s_edge].w=w; edge[s_edge].nxt=head[u]; head[u]=s_edge; edge[++s_edge].v=u; edge[s_edge].w=w; edge[s_edge].nxt=head[v]; head[v]=s_edge; } void spfa(int s) { int i,start=0,tail=0; memset(vs,0,sizeof(vs)); for(i=0;i<n;i++) dis[i]=inf; dis[s]=0, vs[s]=1; qu[tail++]=s; while(start!=tail) { int u=qu[start++]; for(int e=head[u];e;e=edge[e].nxt) { int v=edge[e].v; if(dis[v]>dis[u]+edge[e].w)//!!! { dis[v]=dis[u]+edge[e].w;//注意!!! if(!vs[v]) { qu[tail++]=v;//注意 vs[v]=1; if(tail==nMAX)tail=0; } } } vs[u]=0; if(start==nMAX)start=0; } } int main() { int j,i,num,v,w; while(~scanf("%d",&n)) { memset(head,0,sizeof(head)); s_edge=0; for(i=0;i<n;i++) { scanf("%d%d",&num,&sea[i]); for(j=1;j<=num;j++) { scanf("%d%d",&v,&w); addedge(i,v,w); } } spfa(0); int MIN=inf; for(i=0;i<n;i++) if(MIN>dis[i]&&sea[i]) { MIN=dis[i]; } printf("%d\n",MIN); } return 0; }
floyd代码:
#include<iostream> #include<string> #include<cstdio> #include<cstring> #define inf 1<<20//1<<30就不对,计算中数越界?? #define nMAX 12 using namespace std; int dis[nMAX],sea[nMAX],map[nMAX][nMAX]; int n; void floyd() { int i,j,k; for(k=0;k<n;k++) for(i=0;i<n;i++) for(j=0;j<n;j++) { if(map[i][j]>map[i][k]+map[k][j]) map[i][j]=map[i][k]+map[k][j]; } } int main() { int i,j,sum,k,d; while(~scanf("%d",&n)) { for(i=0;i<n;i++) for(j=0;j<n;j++) { map[i][j]=inf; map[i][i]=0; } for(i=0;i<n;i++)//êäèë { scanf("%d%d",&sum,&sea[i]); for(j=1;j<=sum;j++) { scanf("%d%d",&k,&d); map[i][k]=d; map[k][i]=d; } } floyd(); int mark,MIN=inf; for(i=1;i<n;i++) { if(sea[i]&&MIN>map[0][i]) { MIN=map[0][i]; } } printf("%d\n",MIN); } return 0; }