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
現在給你路線圖。讓你找出從她家附近的起點站(可以有多個)到朋友家附近的終點站(僅僅有一個)花費時間最少的路線。各個網站的編號從1到n。 node
#include<stdio.h> #include<string.h> #define INF 0x3f3f3f3f #include<algorithm> using namespace std; int vis[1010],map[1010][1010],dis[1010],n,ans[1010],num,beg; void init(){ for(int i=1;i<=n;i++) for(int j=0;j<=n;j++){ if(i==j) map[i][j]=map[j][i]=0; else map[i][j]=map[j][i]=INF; } } void dijkstra(){ int k=0,flag=0,i; memset(vis,0,sizeof(vis)); for(i=1;i<=n;i++) dis[i]=map[beg][i]; vis[beg]=1; for(i=1;i<=n;i++){ int j,key,temp=INF; for(int j=1;j<=n;j++) if(!vis[j]&&temp>dis[j]) temp=dis[key=j]; if(temp==INF){ break; } vis[key]=1; for(int j=1;j<=n;j++) if(!vis[j]&&dis[j]>dis[key]+map[key][j]) dis[j]=dis[key]+map[key][j]; } } int main(){ int m; while(scanf("%d%d%d",&n,&m,&beg)!=EOF){ int i; memset(ans,INF,sizeof(INF)); init();//注意要初始化。 for(i=1;i<=m;i++){ int a,b,cost; scanf("%d%d%d",&a,&b,&cost); if(map[b][a]>cost)//過濾掉一樣的邊。反向構圖。再次使用SPFA過一次。這道題很是坑,哦,不,很是坑。假設你數組開小了。用G++提交會顯示超時而不是RE,不明覺厲。map[b][a]=cost; } scanf("%d",&num); dijkstra();//直接找到各個終點的位置。 for(i=0;i<num;i++){ int end; scanf("%d",&end); ans[i]=dis[end]; } sort(ans,ans+num); if(ans[0]==INF)//推斷是否存在這種值。不存在的話ans數組確定每一個都是INF。 printf("-1\n"); else printf("%d\n",ans[0]); } return 0; }算法
#include<stdio.h> #include<string.h> #include<queue> #define INF 0x3f3f3f3f #define N 1010 #define M 20100 using namespace std; int dis[N],vis[N],n,m,edgenum,head[N]; struct node{ int from,to,cost,next; }edge[M];//結構體是用來記錄邊的數量的。應該開到M; void init(){ edgenum=0; memset(head,-1,sizeof(head));//表頭應注意初始時爲-1。 } void add(int u,int v,int cost){ node E={u,v,cost,head[u]}; edge[edgenum]=E; head[u]=edgenum++; } void spfa(int beg){ queue<int>q; memset(dis,INF,sizeof(dis)); memset(vis,0,sizeof(vis)); dis[beg]=0; vis[beg]=1; q.push(beg); while(!q.empty()){ int i,u=q.front(); q.pop(); vis[u]=0; for(i=head[u];i!=-1;i=edge[i].next){ int v=edge[i].to; if(dis[v]>dis[u]+edge[i].cost){ dis[v]=dis[u]+edge[i].cost; if(!vis[v]){ vis[v]=1; q.push(v); } } } } } int main(){ int beg; while(scanf("%d%d%d",&n,&m,&beg)!=EOF){ init(); while(m--){ int a,b,c; scanf("%d%d%d",&a,&b,&c); add(b,a,c); } spfa(beg); int e,min=INF; scanf("%d",&e); while(e--){ int end; scanf("%d",&end); if(min>dis[end]) min=dis[end]; } if(min==INF) printf("-1\n"); else printf("%d\n",min); } return 0; }