最短路、邻接矩阵

这题拿到手里,我很是迷茫。
我不知道这道题该怎么做?刚开始认为是构造,看不出来图论模型。

原来,如果我们把给的矩阵看成图的邻接矩阵的话,那么我们就可以建立图论模型了。
正如题解所说。
condition1:节点1有一个出度
condition2:节点n有一个入度
condition3:节点2->n-1出度与入度相等

我们仔细想想哈,这不就是一条最短路吗!!!!!!1->n
关键的还有:如果形成环,就是形成一个以1为首尾的环和以n为首尾的环。
这也是满足上述条件的。
那么分这两种情况取小就可以了。

#include<iostream>
#include<algorithm>
#include<queue>
#include<vector>
#include<functional>
using namespace std;
typedef pair<int,int> pii;
const int inf = 1e9;
const int max_n = 320;
const int max_m = 1e5+100;
int G[310][310];
int d[310];
int n;
int dijstra(int s,int t){
    priority_queue<pii,vector<pii>,greater<pii>> que;
    for (int i=0;i<=n;++i)d[i]=inf;
    que.push(pii(0,s));d[s]=0;
    while (!que.empty()){
        pii p = que.top();que.pop();
        int u = p.second;
        int dist = p.first;
        if (dist>d[u])continue;
        for (int v=1;v<=n;++v){
            if (v==u)continue;
            if (d[v]>dist+G[u][v]){
                d[v]=dist+G[u][v];
                que.push(pii(d[v],v));
            }
        }
    }return d[t];
}
int main(){
    while (~scanf("%d",&n)){
        for (int i=1;i<=n;++i)for (int j=1;j<=n;++j)scanf("%d",&G[i][j]);
        int ans = dijstra(1,n);
        int res1=inf,res2=inf;
        for (int i=2;i<n;++i)res1 = min(res1,d[i]+G[i][1]);
        dijstra(n,1);
        for (int i=n-1;i>1;--i)res2 = min(res2,d[i]+G[i][n]);
        ans = min(ans,res1+res2);
        cout<<ans<<endl;
    }
}