暴力+剪枝 只得了40分...暂时没想到正解(好吧,查了一下正解dijkstra
#include<bits/stdc++.h> using namespace std; #define ll long long const ll N=500+10; const ll INF=0x3f3f3f3f; ll n,m; struct edge{ ll type; ll to; ll w; edge(){} edge(ll t,ll b,ll c){type=t;to=b;w=c;} }; vector<edge> g[N]; ll vis[N],d[N]; ll t,a,b,c,ans; void dfs(ll u,ll pre,ll flag,ll sum,ll x)//x为已走小道长度 { if(sum>ans) return; if(sum>=d[u]) return; if(u==n) { ans=min(sum,ans); return; } for(ll i=0;i<g[u].size();i++) { ll v=g[u][i].to,w=g[u][i].w; if(v==pre) continue; if(vis[v]) continue; vis[v]=1; ll f=g[u][i].type,t_sum,xx; if(f==0) { t_sum=sum+w; xx=0; } else { t_sum=sum-x*x; xx=x+w; t_sum+=xx*xx; } dfs(v,u,f,t_sum,xx); vis[v]=0; } d[u]=min(d[u],sum); } int main() { //ios::sync_with_stdio(false);cin.tie(0);cout.tie(0); scanf("%lld%lld",&n,&m); for(ll i=0;i<m;i++) { scanf("%lld%lld%lld%lld",&t,&a,&b,&c); g[a].push_back(edge(t,b,c)); g[b].push_back(edge(t,a,c)); } ans=INF; memset(vis,0,sizeof(vis)); memset(d,INF,sizeof(d)); vis[1]=1; dfs(1,-1,0,0,0); printf("%lld\n",ans); return 0; } /* 6 7 1 1 2 3 1 2 3 2 0 1 3 30 0 3 4 20 0 4 5 30 1 3 5 6 1 5 6 1 */