hdu 2680 Choose the best route (spfa)

http://acm.hdu.edu.cn/showproblem.php?pid=2680

 

#include<iostream>
#include<vector>
#include<string.h>
#include<queue>
using namespace std;
#define INF 100000000
vector<int > g[1002];
int w[1002][1002],d[1002],vis[1002];
struct edge{int u;int v;}e[100000];
void spfa(int a,int n)
{
    queue<int > q;
    memset(vis,0,sizeof(vis));//不在队列中
    for(int i=2;i<=n;i++)
        d[i]=INF;

    d[1]=0;
    q.push(1);
    vis[1]=1;
    while(!q.empty())
    {
        int a,b;
        a=q.front(); q.pop();
        for(int i=0;i<g[a].size();i++)
        {
            b=g[a][i];
            if(w[a][b]!=-1)
            {
            if(d[b]>d[a]+w[a][b])
            {
                d[b]=d[a]+w[a][b];
                if(vis[b]==0)
                    q.push(b);
            }
            }
        }
    }
}
            

int main()
{
    int i,j,n,m,a,b,c;
    while(scanf("%d%d",&n,&m)!=EOF)
    {
        memset(w,-1,sizeof(w));
        for(int i=0;i<m;i++)
        {
            scanf("%d%d%d",&a,&b,&c);
            w[a][b]=c; w[b][a]=c;
            if(c>w[a][b]&&w[a][b]!=-1)
                continue;
            g[a].push_back(b);
            g[b].push_back(a);
        }
        spfa(1,n);//   ok
        //printf("ans %d\n",d[n]);
        int u=n; int num=0;
        while(u!=1)
        {
            for(i=0;i<g[u].size ();i++)
            {
                int v=g[u][i];
                if(d[v]+w[u][v]==d[u])
                {
                    
                    edge temp;  temp.u =u; temp.v=v;
                    e[num++]=temp;u=v;
                    break;
                }
            }
        }
        int maxx=0;
        for(i=0;i<num;i++)
        {
            int temp;  temp=w[e[i].u ][e[i].v ];
            w[e[i].u ][e[i].v]=w[e[i].v ][e[i].u]=-1;
            spfa(1,n);
            if(d[n]>maxx)
                maxx=d[n];
            w[e[i].u ][e[i].v]=w[e[i].v ][e[i].u]=temp;
        }
        printf("%d\n",maxx);



    //    for(i=0;i<num;i++)        //ok
        //    printf("edge  %d  %d\n",e[i].u,e[i].v);
        for(i=1;i<=n;i++)
            g[i].clear();
    }
    return 0;
}
    

 

 

posted @ 2013-07-28 22:00  galaxy77  阅读(216)  评论(0编辑  收藏  举报