题目链接:http://118.190.20.162/view.page?gpid=T65
#include <iostream>
#include <stdio.h>
#include <queue>
#include <memory.h>
using namespace std;
const int inf=0x3f3f3f;
long long xl[550][550],dl[550][550];
long long dis_d[550],dis_x[550];
int vis[550];
queue<int> q;
int n,m;
void floyd(){
for(int k=1;k<=n;k++){
for(int i=1;i<=n;i++){
for(int j=1;j<=n;j++){
if(xl[i][j]>xl[i][k]+xl[k][j]&&xl[i][k]!=inf&&xl[k][j]!=inf){
xl[i][j]=xl[i][k]+xl[k][j];
}
}
}
}
}
int main(){
cin>>n>>m;
memset(xl,inf,sizeof(xl));
memset(dl,inf,sizeof(dl));
for(int i=0;i<m;i++){
int t,a,b,c;
cin>>t>>a>>b>>c;
if(t==1&&xl[a][b]>c){
xl[a][b]=xl[b][a]=c;
}
else if(t==0&&dl[a][b]>c){
dl[a][b]=dl[b][a]=c;
}
}
floyd();
memset(dis_d,inf,sizeof(dis_d));
memset(dis_x,inf,sizeof(dis_d));
dis_d[1]=dis_x[1]=0;
vis[1]=1;
q.push(1);
while(!q.empty()){
int now=q.front();
q.pop();
vis[now]=0;
for(int i=1;i<=n;i++){
long long v=dl[now][i];
if(dis_d[i]>dis_d[now]+v){
dis_d[i]=dis_d[now]+v;
if(vis[i]) continue;
vis[i]=1;
q.push(i);
}
if(dis_d[i]>dis_x[now]+v){
dis_d[i]=dis_x[now]+v;
if(vis[i]) continue;
vis[i]=1;
q.push(i);
}
if(xl[now][i]<inf){
v=xl[now][i]*xl[now][i];
if(dis_x[i]>dis_d[now]+v){
dis_x[i]=dis_d[now]+v;
if(vis[i]) continue;
vis[i]=1;
q.push(i);
}
}
}
}
cout<<min(dis_x[n],dis_d[n])<<endl;
return 0;
}