迪杰特斯拉算法 注意都要用long long
如果路径长度不是long long就只有80分,改了length和c为long long就a掉了
#include <iostream>
#include <vector>
#include <queue>
using namespace std;
#define N 500+1
#define INF 1e18
typedef struct
{
bool leixing;
int adj;
long long length;
}road;
bool visited[N]={0};
long long d[N];
long long xiaolu[N]={0};
vector<road> r[N];
int main()
{
int n,m;
int t,a,b;
long long c;
int i;
road temp;
cin>>n>>m;
for( i=1;i<=m;i++)
{
cin>>t>>a>>b>>c;
temp.leixing=t;
temp.adj=a;
temp.length=c;
r[b].push_back(temp);
temp.adj=b;
r[a].push_back(temp);
}
//初始化
visited[1]=1;
for(i=1;i<=n;i++)
d[i]=INF;
for(i=1;i<=n;i++)
{
for(int j=0;j<r[1].size();j++)
{
if(r[1][j].leixing==1)
{
xiaolu[r[1][j].adj]=r[1][j].length;
d[r[1][j].adj]=r[1][j].length*r[1][j].length;
}
else
d[r[1][j].adj]=r[1][j].length;
}
}
while(!visited[n])
{
int minn=INF;
int mark;
for(i=1;i<=n;i++)
{
if(!visited[i]&&d[i]<minn)
{
minn=d[i];
mark=i;
}
}
visited[mark]=1;
for(int j=0;j<r[mark].size();j++)
{
if(!visited[r[mark][j].adj])
{
if(r[mark][j].leixing == 0)//是大路
{
if(d[mark]+r[mark][j].length<d[r[mark][j].adj]) //新路径短、更新
{
d[r[mark][j].adj]=d[mark]+r[mark][j].length;
xiaolu[r[mark][j].adj]=0;
}
}
else//是小路
{
long long x,y;
x=d[mark]-xiaolu[mark]*xiaolu[mark];
y=xiaolu[mark]+r[mark][j].length;
if(x+y*y<=d[r[mark][j].adj])
{
d[r[mark][j].adj]=x+y*y;
xiaolu[r[mark][j].adj]=xiaolu[mark]+r[mark][j].length;
}
}
}
}
}
cout<<d[n]<<endl;
return 0;
}