这道题可以用板子,要注意如果有重边,取权重最小的那条边。
AC代码:
cpp
#include<bits/stdc++.h>
using namespace std;
int jz[60][60],m;
int main(){
cin>>m;
memset(jz,0x3f,sizeof(jz));
for(int i=1;i<=52;i++) jz[i][i]=0;
for(int i=1;i<=m;i++){
char a,b;
int u,v,w;
cin>>a>>b>>w;
if(a>='a') u=int(a)-70;
else u=int(a)-64;
if(b>='a') v=int(b)-70;
else v=int(b)-64;
jz[u][v]=min(jz[u][v],w);
jz[v][u]=min(jz[v][u],w);
}
for(int k=1;k<=52;k++){
for(int i=1;i<=52;i++){
for(int j=1;j<=52;j++)
jz[i][j]=min(jz[i][j],jz[i][k]+jz[k][j]);
}
}
int maxi=0;
jz[0][26]=1e9;
for(int i=1;i<=25;i++){
if(jz[maxi][26]>jz[i][26]) maxi=i;
}
cout<<char(maxi+64)<<" "<<jz[maxi][26];
return 0;
}
AC代码
cpp
#include<bits/stdc++.h>
using namespace std;
const int INF=0x3f3f3f3f;
int n,m,d[110][110],g[110][110],ans=INF;
int main(){
scanf("%d%d",&n,&m);
memset(d,INF,sizeof(d));
memset(g,INF,sizeof(g));
for(int i=1;i<=n;i++) g[i][i]=0,d[i][i]=0;
for(int i=1;i<=m;i++){
int u,v,w;
scanf("%d%d%d",&u,&v,&w);
d[u][v]=min(d[u][v],w);
d[v][u]=min(d[v][u],w);
g[u][v]=min(g[u][v],w);
g[v][u]=min(g[v][u],w);
}
for(int k=1;k<=n;k++){
for(int i=1;i<=n;i++){
for(int j=1;j<=n;j++){
if(d[i][j]!=INF&&d[i][k]!=INF&&d[k][j]!=INF&&i!=k&&k!=j&&i!=j)
ans=min(ans,d[i][j]+g[i][k]+g[k][j]);
d[i][j]=min(d[i][j],d[i][k]+d[k][j]);
}
}
}
if(ans==INF) printf("No solution.");
else printf("%d",ans);
return 0;
}
FLoyd求最短路径并打印。我们这里开一个数组path,path[i][j]存储点i和j之间最短路径上离i最近的一个中转点。
cpp
#include<bits/stdc++.h>
using namespace std;
int nxt[105][105],n,g[105][105];
void init(){
for(int i=0;i<=n;i++){
for(int j=0;j<=n;j++){
if(i==j) g[i][j]=g[j][i]=0;
else g[i][j]=g[j][i]=1e9;
}
}
}
void printpath(){
int st=1,ed=n;
while(st!=ed){
cout<<st<<" ";
st=nxt[st][ed];
}
printf("%d",ed);
}
void floyd(){
for(int i=1;i<=n;i++){
for(int j=1;j<=n;j++)
nxt[i][j]=j;
}
for(int k=1;k<=n;k++){
for(int i=1;i<=n;i++){
for(int j=1;j<=n;j++){
if(g[i][j]>g[i][k]+g[k][j]){
g[i][j]=g[i][k]+g[k][j];
nxt[i][j]=nxt[i][k];
}
}
}
}
cout<<"minlong=";
printf("%d\n",g[1][n]);
printpath();
}
int main(){
cin>>n;
for(int i=1;i<=n;i++){
for(int j=1;j<=n;j++){
cin>>g[i][j];
if(g[i][j]==0)
g[i][j]=99999;
}
}
floyd();
return 0;
}
cpp
#include<bits/stdc++.h>
using namespace std;
const int maxn=100;
int g1[maxn][maxn],g2[maxn][maxn];
int n,m,ans;
int main(){
cin>>n>>m;
for(int i=1;i<=m;i++){
int u,v;
cin>>u>>v;
g1[u][v]=1;
g2[v][u]=1;
}
for(int k=1;k<=n;k++){
for(int i=1;i<=n;i++){
for(int j=1;j<=n;j++)
g1[i][j]|=(g1[i][k]&g1[k][j]);
}
}
for(int k=1;k<=n;k++){
for(int i=1;i<=n;i++){
for(int j=1;j<=n;j++)
g2[i][j]|=(g2[i][k]&g2[k][j]);
}
}
int ans=0;
for(int i=1;i<=n;i++){
int tmp1=0,tmp2=0;
for(int j=1;j<=n;j++){
tmp1+=g1[i][j];
tmp2+=g2[i][j];
}
if(abs(tmp1)>=(n+1)/2||abs(tmp2)>=(n+1)/2)
++ans;
}
cout<<ans;
return 0;
}