标签:ack size out font 数组 add using output eof
http://acm.hdu.edu.cn/showproblem.php?pid=2680
5 8 5 1 2 2 1 5 3 1 3 4 2 4 7 2 5 6 2 3 5 3 5 1 4 5 1 2 2 3 4 3 4 1 2 3 1 3 4 2 3 2 1 1
1 -1
//Dijkstra
#include<stdio.h> #include<string.h> #define INF 0x3f3f3f3f int map[1010][1010]; int dis[20200]; bool used[20200]; int n; int e; int dijkstra() { int i,j; memset(used,0,sizeof(used)); for(i=0;i<=n;++i) dis[i]=INF; int pos; for(i=0;i<=n;++i)//第一次给dis赋值 { dis[i]=map[0][i]; } dis[0]=0; used[0]=1; for(i=0;i<n;++i)//最多执行n次 { int min=INF; for(j=0;j<=n;++j) { if(!used[j]&&dis[j]<min) { min=dis[j]; pos=j; } } used[pos]=1; if(pos==e) return dis[pos]; for(j=0;j<=n;++j)//把dis数组更新。也叫松弛 { if(!used[j]&&dis[j]>map[pos][j]+dis[pos]) { dis[j]=map[pos][j]+dis[pos]; } } } return -1; } int main() { int m,s,T; int u,v,w; int temp; int i,j; while(~scanf("%d%d%d",&n,&m,&e)) { for(i=0;i<=n;++i) for(j=0;j<=i;++j) map[i][j]=map[j][i]=INF; for(i=1;i<=m;++i) { scanf("%d%d%d",&u,&v,&w); if(map[u][v]>w) map[u][v]=w; } scanf("%d",&T); for(i=1;i<=T;++i) { scanf("%d",&temp); map[0][temp]=0;//0指向要找的原点 } int ans=dijkstra();//万能源点0 if(ans==-1)printf("-1\n"); else printf("%d\n",ans); } return 0; }
//SPFA
#include <cstdio> #include <cstring> #include <queue> #define MAXN 1100 #define MAXM 22000 #define INF 0x3f3f3f3f using namespace std; int map[MAXN][MAXN]; int vis[MAXN];//推断是否增加队列了 int num; int low[MAXM];//存最短路径 int e; int M, N; void SPFA() { int i, j; queue<int> Q; memset(low, INF, sizeof(low)); memset(vis, 0, sizeof(vis)); vis[0] = 1; low[0] = 0; Q.push(0); while(!Q.empty()) { int u = Q.front(); Q.pop(); vis[u] = 0;//出队列了。不在队列就变成0 for(i = 1; i <= N; ++i) { if(low[i] > low[u] + map[u][i]) { low[i] = low[u] + map[u][i]; if(!vis[i]) { vis[i]=1; Q.push(i); } } } } if(low[e] == INF) printf("-1\n"); else printf("%d\n",low[e]); } int main() { int u, v, w; while(~scanf("%d%d%d", &N, &M, &e)) { for(int i=0; i<=N;++i) for(int j=0;j<=i;++j) map[i][j]=map[j][i]=INF; while(M--) { scanf("%d%d%d", &u, &v, &w); if(map[u][v]>w)//一定要判重 map[u][v]=w; // map[u][v]=w; // map[v][u]=w; } int T,s; scanf("%d",&T); while(T--) { scanf("%d",&s); map[0][s]=0;//万能源点 } SPFA(); } return 0; }
Choose the best route HDU杭电2680【dijkstra算法 || SPFA】
标签:ack size out font 数组 add using output eof
原文地址:http://www.cnblogs.com/lxjshuju/p/6977787.html