題解:將修改幾次1等價爲構圖時邊的權值即可。跑單源最短路。
#include<iostream> #include<cstdio> #include<queue> #include<cstring> #include<algorithm> using namespace std; #define N 301 #define LL long long int n; int sumedge; int head[N]; LL dis[N]; int vis[N]; queue<int>q; struct Edge { int x,y,z,nxt; Edge(int x=0,int y=0,int z=0,int nxt=0): x(x),y(y),z(z),nxt(nxt){} }edge[N*N]; void add(int x,int y,int z) { edge[++sumedge]=Edge(x,y,z,head[x]); head[x]=sumedge; } void spfa() { memset(dis,0x3f,sizeof(dis)); dis[1]=0;q.push(1);vis[1]=1; while(!q.empty()) { int now=q.front();q.pop();vis[now]=false; for(int i=head[now];i;i=edge[i].nxt) { int v=edge[i].y; if(dis[v]>dis[now]+edge[i].z) { dis[v]=dis[now]+edge[i].z; if(!vis[v]) { vis[v]=true; q.push(v); } } } } } int main() { scanf("%d",&n); for(int i=1;i<=n;i++) { int js=0; for(int j=1;j<=n;j++) { int x; scanf("%d",&x); if(x) add(i,j,js++); } } spfa(); if(dis[n]==0x3f3f3f)printf("-1\n"); else printf("%lld\n",dis[n]); return 0; }