fzu 2243 Daxia like uber

来源:互联网 发布:mac python numpy安装 编辑:程序博客网 时间:2024/06/05 10:51

http://acm.fzu.edu.cn/problem.php?pid=2243



有向图,一个起点,要去接2个客人并且都要送到目的地,求最短路程
单源最短路多来几遍就可以了,spfa或者其他算法都可以。



#include <iostream>#include <stdio.h>#include <string.h>#include <vector>#include <algorithm>#include<queue>using namespace std;const int inf=0x3f3f3f3f;const int M=1005;struct node{int from,to,dis,next;}e[111111];int vis[M],dist[M],head[M];int n,m,t;void add(int i,int j,int w){e[t].from=i;e[t].to=j;e[t].dis=w;e[t].next=head[i];head[i]=t++;}void spfa(int s){queue<int>q;for(int i=1;i<=n;i++){dist[i]=inf;}memset(vis,false,sizeof(vis));q.push(s);dist[s]=0;while(!q.empty()){int u=q.front();q.pop();vis[u]=false;for(int i=head[u];i!=-1;i=e[i].next){int v=e[i].to;if(dist[v]>dist[u]+e[i].dis){dist[v]=dist[u]+e[i].dis;if(!vis[v]){vis[v]=true;q.push(v);}}}}}int main(){        while(scanf("%d%d",&n,&m)!=EOF)    {    int s,x1,y1,x2,y2;    t=0;    memset(head,-1,sizeof(head));    scanf("%d%d%d%d%d",&s,&x1,&y1,&x2,&y2);    while(m--)    {    int a,b,c;    scanf("%d%d%d",&a,&b,&c);    add(a,b,c);}spfa(s);int a1=dist[x1],a2=dist[x2];spfa(x1);int a3=dist[x2],a4=dist[y1],a5=dist[y2];spfa(x2);int a6=dist[x1],a7=dist[y1],a8=dist[y2];spfa(y1);int a9=dist[x2],a10=dist[y2];spfa(y2);int a11=dist[y1],a12=dist[x1];int ans=a1+a3+a7+a10;ans=min(ans,a1+a4+a9+a8);ans=min(ans,a1+a3+a8+a11);ans=min(ans,a2+a6+a4+a10);ans=min(ans,a2+a6+a5+a11);ans=min(ans,a2+a8+a4+a12);cout<<ans<<endl;}return 0;}


原创粉丝点击