标签:live 简单 inf wrap class 最短路 ring 循环 struct
5 1 0 1 1 2 0 2 3 3 1 1 1 4 100 0 1 0 1
2
最短路径。话不多说,SPFA,dijkstra,floyd各贡献一枚!
dijkstra:
#include<cstdio> #include<cstring> #include<algorithm> #define INF 0x3f3f3f3f using namespace std; int map[15][15],dis[1000],vis[1000],target[15]; int N; void dijkstra() { memset(dis,INF,sizeof(dis)); int i,j; for(i=0;i<N;i++) { dis[i]=map[0][i]; vis[i]=0; } dis[0]=0; vis[0]=1; for(i=0;i<N;i++) { int mi=INF,mark=-1; for(j=0;j<N;j++) { if(!vis[j]&&dis[j]<mi) { mi=dis[j]; mark=j; } } if(mark==-1) break; vis[mark]=1; for(j=0;j<N;j++) { if(!vis[j]&&dis[j]>dis[mark]+map[mark][j]) dis[j]=dis[mark]+map[mark][j]; } } } int main() { int n,a,b,d,i,j,m; while(scanf("%d",&N)!=EOF) { int t=0; memset(map,INF,sizeof(map)); for(i=0;i<N;i++) { scanf("%d%d",&m,&n); if(n) target[t++]=i; for(j=0;j<m;j++) { scanf("%d%d",&a,&b); map[i][a]=map[a][i]=b; } } dijkstra(); int s[15]; for(i=0;i<t;i++) s[i]=dis[target[i]]; sort(s,s+t); printf("%d\n",s[0]); } return 0; }
floyd:
#include<cstdio> #include<cstring> #define INF 0x3f3f3f3f using namespace std; int target[1000],map[15][15]; int N; void floyd() { int i,k,j; for(k=0;k<N;k++) { for(i=0;i<N;i++) { if(map[k][i]==INF) continue; 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 n,i,j,a,d,m; while(scanf("%d",&N)!=EOF) { int t=0; memset(map,INF,sizeof(map)); for(i=0;i<N;i++) { scanf("%d%d",&m,&n); if(n) target[t++]=i; for(j=0;j<m;j++) { scanf("%d%d",&a,&d); map[i][a]=map[a][i]=d; } } floyd(); int q=INF; for(i=0;i<t;i++) q=q>map[0][target[i]]?map[0][target[i]]:q; printf("%d\n",q); } return 0; }
SPFA:
#include<cstdio> #include<cstring> #include<algorithm> #include<queue> #define INF 0x3f3f3f3f using namespace std; int head[20],target[15],vis[20],dis[20]; int N,t,w; struct node { int from,to,weight,next; }s[1000]; void spfa() { memset(vis,0,sizeof(vis)); memset(dis,INF,sizeof(dis)); queue<int> q; q.push(0); vis[0]=1; dis[0]=0; while(!q.empty()) { int u=q.front(); q.pop(); vis[u]=0; dis[0]=0; for(int k=head[u];k!=-1;k=s[k].next) { int v=s[k].to; if(dis[v]>dis[u]+s[k].weight) { dis[v]=dis[u]+s[k].weight; if(!vis[v]) { q.push(v); vis[v]=1; } } } } int qw[1000]; for(int i=0;i<t;i++) qw[i]=dis[target[i]]; sort(qw,qw+t); printf("%d\n",qw[0]); } int main() { int n,a,b,d,i,j,m; while(scanf("%d",&N)!=EOF) { t=0,w=0; memset(head,-1,sizeof(head)); for(i=0;i<N;i++) { scanf("%d%d",&m,&n); if(n) target[t++]=i; for(j=0;j<m;j++) { scanf("%d%d",&a,&b); s[w].from=i; s[w].to=a; s[w].weight=b; s[w].next=head[i]; head[i]=w++; s[w].from=a; s[w].to=i; s[w].weight=b; s[w].next=head[a]; head[a]=w++; } } spfa(); } return 0; }
有什么问题希望大家指出。谢谢!
hdu3665-Seaside(SPFA,dijkstra,floyd)
标签:live 简单 inf wrap class 最短路 ring 循环 struct
原文地址:http://www.cnblogs.com/blfbuaa/p/7297391.html