AOJ2249Contest Page(最短路径spfa)

来源:互联网 发布:西游之路坐骑进阶数据 编辑:程序博客网 时间:2024/06/01 13:42

或说博主每次都会发现别人没发现的问题,然后一直卡死。。。。。
这是一道求最短路问题的同时,顺便把此时的最小花费求一下,重点是最短路相等的时候,不能再最短路相的地方直接同时求花费,而要单列出来求,那就是直接spfa,然后顺便加一下就ok了,代码如下

#include <iostream>#include <stdio.h>#include <queue>#include <string.h>using namespace std;const int INF=0x3f3f3f3f;const int maxm=20005;const int maxn=10005;struct EdgeNode{    int to;    int w;    int d;    int next;};EdgeNode edges[maxn*maxn];//这里要注意int n,m;int head[maxn],edge;bool vis[maxn];queue<int>que;long long dis[maxn],cost[maxn];void add(int u,int v,int d,int c){    edges[edge].w=c;    edges[edge].d=d;    edges[edge].to=v;    edges[edge].next=head[u];    head[u]=edge++;}void init(){    memset(head,-1,sizeof(head));    edge=0;}int spfa(int n){    int u,sum2=0;    dis[0]=0;    cost[0]=0;    for(int i=1; i<=n; i++)    {        dis[i]=INF;        cost[i]=INF;    }    memset(vis,0,sizeof(vis));    while(!que.empty())        que.pop();    que.push(1);    //sum2++;    vis[1]=true;    dis[1]=0;    cost[1]=0;    while(!que.empty())    {        u=que.front();        que.pop();        vis[u]=false;        for(int i=head[u]; i!=-1; i=edges[i].next)        {            int v=edges[i].to;            int w=edges[i].w;            int d=edges[i].d;            if(dis[v]>dis[u]+d)//不能在这里直接用等号,用了之后第三组样例过不去            {                dis[v]=dis[u]+d;                cost[v]=w;                if(!vis[v])                {                    vis[v]=true;                    que.push(v);                }            }            else if(dis[v]==dis[u]+d)            {                if(cost[v]>w)                    cost[v]=w;            }        }    }    for(int i=1;i<=n;i++)        cost[0]+=cost[i];        return cost[0];}int main(){    int u0,v0,d0,c0;    while(cin>>n>>m)    {        init();        if(n==0&&m==0)            break;        int sum=0;        for(int i=1; i<=m; i++)        {            cin>>u0>>v0>>d0>>c0;            add(u0,v0,d0,c0);            add(v0,u0,d0,c0);        }        sum=spfa(n);        cout<<sum<<endl;    }    return 0;}
0 0
原创粉丝点击