维修道路
这道题目涉及到一个新算法:Floyd
这里不放洋屁了,大体就是
DP!
就是一个固定格式的dp
它的核心代码非常简单(也非常像dp)
for(int k=1;k<=V;k++) { for(int i=1;i<=V;i++) { for(int j=1;j<=V;j++) { if(dis[i][j]>dis[i][k]+dis[k][j]) dis[i][j]=dis[i][k]+dis[k][j]; } } }
这道题目的主要思路是:初始化dis+输入+储存vis(用来记录此点是不是被破坏)+整理dis(将有连接并并没被破坏的点设成0)+套模板+输出+2 hours debug= A C!
程序:
#include<bits/stdc++.h> using namespace std; const int inf=1e9; int n,m,dis[1010][1010]={0},vis[1010][1010]={0}; //void print() //{ // for(int i=1;i<=n;i++) // { // for(int j=1;j<=n;j++) // { // printf("%10d ",dis[i][j]); // } // printf("\n"); // } // printf("\n"); //} int main() { // freopen("1.in","r",stdin); // freopen("1.out","w",stdout); cin>>n>>m; for(int i=1;i<=n;i++) { for(int j=1;j<=n;j++) { if(i!=j) dis[i][j]=inf; } } for(int i=1;i<=m;i++) { int b,c,v; scanf("%d%d%d",&b,&c,&v); dis[b][c]=dis[c][b]=v; } int d; scanf("%d",&d); for(int i=1;i<=d;i++) { int a,b; scanf("%d%d",&a,&b); vis[a][b]=vis[b][a]=1; } // printf(); for(int i=1;i<=n;i++) { for(int j=1;j<=n;j++) { if(vis[i][j]==0&&dis[i][j]!=inf) { dis[i][j]=0; } } } // print(); int a,b; scanf("%d%d",&a,&b); for(int k=1;k<=n;k++) { for(int i=1;i<=n;i++) { for(int j=1;j<=n;j++) { dis[i][j]=min(dis[i][j],dis[i][k]+dis[k][j]); } } } printf("%d",dis[a][b]); return 0; }