hdu 5137 枚举+spfa

来源:互联网 发布:黄觉老婆麦子知乎 编辑:程序博客网 时间:2024/06/04 18:30

很自以为是的敲完代码,乱提交一通都不过。忽略了无向图这一点,预处理就错了

另外,无解的情况应该如何表示?熟视无睹

#include<cctype>#include<cmath>#include<cstdio>#include<cstring>#include<algorithm>#include<iostream>#include<string>#include<queue>#include<stack>#include<set>#include<map>#define REP(i,a,b) for (i=(a);i<=(b);i++)#define CLEAR(a) memset((a),0,sizeof((a)))using namespace std;typedef long long LL;const double pi = acos(-1.0);const int maxn=50;//const int inf=99999999;const float eps=1e-3;int n,m,inf,ans=0;int a[maxn][maxn],d[maxn],last[maxn],vis[maxn];void init();void solve();void outp();int main(){    n=1;    m=1;    while(~scanf("%d%d",&n,&m)&&n&&m)        {            init();            solve();            outp();        }    return 0;}int spfa(){    memset(vis,0,sizeof(vis));    memset(d,127,sizeof(d));    queue<int> q;    q.push(1);    vis[1]=1;    d[1]=0;    while(!q.empty())    {        int k=q.front();        q.pop();        vis[k]=0;        for(int i=1;i<=n;i++)        {            if (d[k]+a[k][i]<d[i])            {                d[i]=d[k]+a[k][i];                if (vis[i]==0)                {                    q.push(i);                    vis[i]=1;                }            }        }    }    return d[n];}void solve(){    int tmp[maxn][maxn];    for(int i=2;i<=n-1;i++)    {        memcpy(tmp[0],a[0],sizeof(a));        for(int j=1;j<=n;j++)        {            a[i][j]=a[j][i]=inf;        }        ans=max(ans,spfa());        memcpy(a[0],tmp[0],sizeof(a));    }}void init(){    memset(a,127,sizeof(a));    inf=a[0][0];    ans=-1;    for(int i=1;i<=m;i++)    {        int x,y,v;        cin>>x>>y>>v;        a[x][y]=min(a[x][y],v);        a[y][x]=min(a[y][x],v);    }}void outp(){    if (ans>=inf) printf("Inf\n");    else printf("%d\n",ans);}


0 0
原创粉丝点击