最短路_HDU_4370

来源:互联网 发布:chrome 淘宝联盟插件 编辑:程序博客网 时间:2024/05/22 07:06
/*我溜啊,太神了,给定的关系居然能转换成酱紫的一副图的问题,完全没有这方面的觉悟啊X12+X13+……+X1n=1可以翻译为1的初度是1X1n+X2n+……+Xn-1n=1则翻译为n的入度是1Xki(1<=k<=n) = Xij(1<=j<=n)表示为其他点的入度等于出度所以说1到n跑一遍最短路就妥妥的了,这刚好满满足条件但是,题给又没有说1的入度和n的出度情况,所以,可能在1跟n存在环存在那么1到n的环又是如何考虑呢?也就是说到1可以在次考虑那么就是在跑最短路的时候,dis[star]先设置为oo, 其他与star链接的点更新距离,并入栈*/#include<iostream>#include<cstring>#include<cstdio>#include<queue>#define oo 0x3f3f3f3fconst int maxn = 350;using namespace std;int n;int mp[maxn][maxn];int vis[maxn],dis[maxn];queue<int> que;void SPFA(int s){    while(!que.empty())que.pop();    for(int i = 1; i<= n; i++)    {        if(i ==s)        {            dis[i] = oo;            vis[i] = 0;        }        else        {            dis[i] = mp[s][i];            que.push(i);            vis[i] = 1;        }    }    while(!que.empty())    {        int u = que.front();        que.pop();        for(int v = 1; v <= n; v++)        {            if(dis[v]>dis[u]+mp[u][v])            {                dis[v] = dis[u]+mp[u][v];                if(!vis[v])                {                    vis[v] = 1;                    que.push(v);                }            }        }        vis[u] = 0;    }}int main(){    while(scanf("%d",&n)!=EOF)    {        for(int i = 1; i <= n; i++)        {            for(int j = 1; j <= n; j++)            {                scanf("%d",&mp[i][j]);            }        }        SPFA(1);        int d1 = dis[n];        int d2 = dis[1];        SPFA(n);        int d3 = dis[n];        int ans = d1<(d2+d3)?d1:(d2+d3);        printf("%d\n",ans);    }    return 0;}
0 0
原创粉丝点击