- Til the Cows Come Home
板子题,不多说直接上代码
#include<iostream>
#include<stdio.h>
#include<math.h>
#include<string.h>
#include<string>
#include<vector>
#include<queue>
#include<algorithm>
#include<deque>
#include<map>
#include<stdlib.h>
#include<set>
#include<iomanip>
#include<stack>
//#include<bits/stdc++.h>
#define ll long long
#define ull unsigned long long
#define ms(a,b) memset(a,b,sizeof(a))
#define lowbit(x) x & -x
#define fi first
#define se second
#define lson num<<1
#define rson num<<1|1
#define bug cout<<"----acac----"<<endl
#define IOS ios::sync_with_stdio(false), cin.tie(0),cout.tie(0)
using namespace std;
const int maxn = 1e4+ 50;
const double esp = 1e-6;
const int inf = 0x3f3f3f3f;
const ll lnf = 0x3f3f3f3f3f3f3f3f;
const ll mod = 23333;
const double pi=3.141592653589;
int vis[maxn], first[maxn], len = 0;
int a[maxn];
int dis[maxn];
int n, m;
struct node
{
int to, next, val;//t代表时间,c代表承重
}e[maxn << 1];
void add(int u, int v, int w)
{
e[len].to = v;
e[len].next = first[u];
e[len].val = w;
first[u] = len++;
}
struct point
{
int val, id;
point(int id, int val)
{
this->id = id;
this->val = val;
}
bool operator<(const point& x)const
{
return val > x.val;
}
};
void dij(int s)
{
ms(vis, 0);
for (int i = 0; i <= m; i++) dis[i] = inf;
priority_queue<point>q;
q.push(point(s, 0));
dis[s] = 0;
while (!q.empty())
{
int rt = q.top().id;
q.pop();
if (vis[rt]) continue;
vis[rt] = 1;
for (int i = first[rt]; i != -1; i = e[i].next)
{
int id = e[i].to;
if (!vis[id] && dis[rt] + e[i].val < dis[id])
{
dis[id] = dis[rt] + e[i].val;
//cout<<dis[id][count1]<<endl;
q.push(point(id, dis[id]));
}
}
}
}
int main()
{
ms(first,-1);
scanf("%d%d",&n,&m);
for(int i=1;i<=n;i++)
{
int u,v,w;
scanf("%d%d%d",&u,&v,&w);
add(u,v,w);
add(v,u,w);
}
dij(1);
printf("%d\n",dis[m]);
return 0;
}
- Frogger
题意就是小青蛙从1到2的最短距离,这一题感觉用dijstra有点麻烦,直接flord(忘了到底是啥名字了)
#include<iostream>
#include<stdio.h>
#include<math.h>
#include<string.h>
#include<string>
#include<vector>
#include<queue>
#include<algorithm>
#include<deque>
#include<map>
#include<stdlib.h>
#include<set>
#include<iomanip>
#include<stack>
#define ll long long
#define ms(a,b) memset(a,b,sizeof(a))
#define lowbit(x) x & -x
#define fi first
#define se second
#define bug cout<<"----acac----"<<endl
#define IOS ios::sync_with_stdio(false), cin.tie(0),cout.tie(0)
using namespace std;
const ll maxn = 2e5 + 50;
const double eps = 1e-7;
const int inf = 0x3f3f3f3f;
const ll lnf = 0x3f3f3f3f3f3f3f3f;
const int mod = 1e8;
const double pi=3.141592653589;
int n;
struct node
{
int x,y;
}a[205];
double dp[205][205];
int main()
{
int cas=1;
while(~scanf("%d",&n))
{
if(n==0)break;
for(int i=1;i<=n;i++)
{
scanf("%d%d",&a[i].x,&a[i].y);
}
for(int i=1;i<=n;i++)
{
for(int j=1;j<i;j++)
{
dp[i][j]=dp[j][i]=sqrt(1.0*(a[i].x-a[j].x)*(a[i].x-a[j].x)+(1.0*a[i].y-a[j].y)*(a[i].y-a[j].y));
// printf("%d %d %lf \n",i,j,dp[i][j]);
}
}
for(int k=1;k<=n;k++)
{
for(int i=1;i<=n;i++)
{
for(int j=1;j<=n;j++)
{
dp[i][j]=min(dp[i][j],max(dp[i][k],dp[k][j]));
}
}
}
printf("Scenario #%d\n",cas++);
printf("Frog Distance = %.3f\n\n",dp[1][2]);
}
return 0;
}
3.Heavy Transportation
每条边有一个最大承重,求从1到n最的路径中可以运输的最大重量
,怎么想呢?先初始化dis[i]=0(因为dis【i】这里代表的是从1到i的最大可以承重也就是这一条由1到i的最所有边里最小承重),然后按照原来的方法去求,只不过判断条件变了一下。
#include<iostream>
#include<stdio.h>
#include<math.h>
#include<string.h>
#include<string>
#include<vector>
#include<queue>
#include<algorithm>
#include<deque>
#include<map>
#include<stdlib.h>
#include<set>
#include<iomanip>
#include<stack>
#define ll long long
#define ms(a,b) memset(a,b,sizeof(a))
#define lowbit(x) x & -x
#define fi first
#define se second
#define bug cout<<"----acac----"<<endl
#define IOS ios::sync_with_stdio(false), cin.tie(0),cout.tie(0)
using namespace std;
const ll maxn = 1e6 + 50;
const double eps = 1e-7;
const int inf = 0x3f3f3f3f;
const ll lnf = 0x3f3f3f3f3f3f3f3f;
const int mod = 1e8;
const double pi=3.141592653589;
int vis[1050], first[1050], len = 0;//firrs一定要初始化为-1memest(first,-1,sizeof(first));
int dis[1050];
int n, m;
struct node
{
int to, next, val;
}e[maxn << 1];
void add(int u, int v, int w)
{
e[len].to = v;
e[len].next = first[u];
e[len].val = w;
first[u] = len++;
}
struct point
{
int val, id;
point(int id, int val)
{
this->id = id;
this->val = val;
}
bool operator<(const point& x)const
{
return val < x.val;
}
};
void dij(int s)
{
ms(vis, 0);
for (int i = 0; i <= n; i++) dis[i] = 0;
dis[s]=inf;
priority_queue<point>q;
q.push(point(s,dis[s]));
while (!q.empty())
{
int rt = q.top().id;
q.pop();
if (vis[rt]) continue;
vis[rt] = 1;
for (int i = first[rt]; i != -1; i = e[i].next)
{
int id = e[i].to;
if (!vis[id] && dis[id]<min(dis[rt],e[i].val))
{
dis[id] = min(dis[rt],e[i].val);
//cout<<dis[id][count1]<<endl;
q.push(point(id, dis[id]));
}
}
}
}
int main()
{
int t;
scanf("%d",&t);
int cas=1;
while(t--)
{
len=0;
ms(first,-1);
scanf("%d%d",&n,&m);
for(int i=1;i<=m;i++)
{
int u,v,w;
scanf("%d%d%d",&u,&v,&w);
add(u,v,w);
add(v,u,w);
}
dij(1);
printf("Scenario #%d:\n",cas++);
printf("%d\n\n",dis[n]);
}
return 0;
}
4.Silver Cow Party
这里是n个点每个点到s点的距离再加上从s点到各个点的距离其中所有可能的最大值,我的方法是先求s点到各个点的距离,再求1到n个点到s点的距离(n次dij)得到,因为数据小水过了,都是有一个更高效的方法,正着建一次跑一次从s到各个点的距离,反正建一次跑s到各个点的距离(其实就是从各个点到s点的距离)
#include<iostream>
#include<stdio.h>
#include<math.h>
#include<string.h>
#include<string>
#include<vector>
#include<queue>
#include<algorithm>
#include<deque>
#include<map>
#include<stdlib.h>
#include<set>
#include<iomanip>
#include<stack>
#define ll long long
#define ms(a,b) memset(a,b,sizeof(a))
#define lowbit(x) x & -x
#define fi first
#define se second
#define bug cout<<"----acac----"<<endl
#define IOS ios::sync_with_stdio(false), cin.tie(0),cout.tie(0)
using namespace std;
const ll maxn = 1e6 + 50;
const double eps = 1e-7;
const int inf = 0x3f3f3f3f;
const ll lnf = 0x3f3f3f3f3f3f3f3f;
const int mod = 1e8;
const double pi=3.141592653589;
int vis[1050], first[1050], len = 0;//firrs一定要初始化为-1memest(first,-1,sizeof(first));
int dis[1050],sum[1005];
int n, m, x;
struct node
{
int to, next, val;
}e[maxn << 1];
void add(int u, int v, int w)
{
e[len].to = v;
e[len].next = first[u];
e[len].val = w;
first[u] = len++;
}
struct point
{
int val, id;
point(int id, int val)
{
this->id = id;
this->val = val;
}
bool operator<(const point& x)const
{
return val > x.val;
}
};
void dij(int s)
{
for(int i=0;i<=n;i++)
{
vis[i]=0;
dis[i]=inf;
}
priority_queue<point>q;
dis[s]=0;
q.push(point{s,0});
while(!q.empty())
{
int rt=q.top().id;
q.pop();
if(vis[rt])continue;
vis[rt]=1;
for(int i=first[rt];~i;i=e[i].next)
{
int id=e[i].to;
if(!vis[id]&&dis[rt]+e[i].val<dis[id])
{
dis[id]=dis[rt]+e[i].val;
q.push(point{id,dis[id]});
}
}
}
}
int main()
{
ms(first,-1);
len=0;
scanf("%d%d%d",&n,&m,&x);
for(int i=1;i<=m;i++)
{
int u,v,w;
scanf("%d%d%d",&u,&v,&w);
add(u,v,w);
}
dij(x);
for(int i=1;i<=n;i++)
{
sum[i]=dis[i];
}
int ans=0;
for(int i=1;i<=n;i++)
{
dij(i);
ans=max(ans,dis[x]+sum[i]);
}
printf("%d\n",ans);
return 0;
}
- Currency Exchange
spfa判断,如果循环中出现了起始货币小于在换的货币就代表可以;
#include<iostream>
#include<stdio.h>
#include<math.h>
#include<string.h>
#include<string>
#include<vector>
#include<queue>
#include<algorithm>
#include<deque>
#include<map>
#include<stdlib.h>
#include<set>
#include<iomanip>
#include<stack>
#define ll long long
#define ms(a,b) memset(a,b,sizeof(a))
#define lowbit(x) x & -x
#define fi first
#define se second
#define bug cout<<"----acac----"<<endl
#define IOS ios::sync_with_stdio(false), cin.tie(0),cout.tie(0)
using namespace std;
const int maxn = 3e4 + 50;
const int maxm = 1.5e5+50;
const double eps = 1e-7;
const int inf = 0x3f3f3f3f;
const ll lnf = 0x3f3f3f3f3f3f3f3f;
const int mod = 1e8;
const double pi=3.141592653589;
//int vis[maxn], first[maxn], len = 0;//firrs一定要初始化为-1memest(first,-1,sizeof(first));
double rate[105][105],com[105][105];
int n,m,s;
double v;
double dis[105];
bool spfa(int s)
{
queue<int>q;
for(int i=1;i<=n;i++)
{
dis[i]=0;
// vis[i]=0;
}
q.push(s);
dis[s]=v;
while(!q.empty())
{
int u=q.front();
q.pop();
for(int i=1;i<=n;i++)
{
if(dis[i]<(dis[u]-com[u][i])*rate[u][i])
{
dis[i]=(dis[u]-com[u][i])*rate[u][i];
if(dis[s]>v)
{
return 1;
}
q.push(i);
}
}
}
return 0;
}
int main()
{
scanf("%d%d%d%lf",&n,&m,&s,&v);
for(int i=1;i<=m;i++)
{
int u,v;
double x,y,z,w;
scanf("%d%d%lf%lf%lf%lf",&u,&v,&x,&y,&z,&w);
rate[u][v]=x,rate[v][u]=z;
com[u][v]=y,com[v][u]=w;
}
if(spfa(s))
{
printf("YES\n");
}
else
{
printf("NO\n");
}
return 0;
}
- Wormholes
这个题目我感觉十分的神奇,在传送虫洞可以减少时间,走路是正的时间问的是是否可以看见以前的自己,也就是说回到过去自己当时所在地,则只要出现了负环就可以看见。
#include<iostream>
#include<stdio.h>
#include<math.h>
#include<string.h>
#include<string>
#include<vector>
#include<queue>
#include<algorithm>
#include<deque>
#include<map>
#include<stdlib.h>
#include<set>
#include<iomanip>
#include<stack>
#define ll long long
#define ms(a,b) memset(a,b,sizeof(a))
#define lowbit(x) x & -x
#define fi first
#define se second
#define bug cout<<"----acac----"<<endl
#define IOS ios::sync_with_stdio(false), cin.tie(0),cout.tie(0)
using namespace std;
const int maxn = 3e4 + 50;
const int maxm = 1.5e5+50;
const double eps = 1e-7;
const int inf = 0x3f3f3f3f;
const ll lnf = 0x3f3f3f3f3f3f3f3f;
const int mod = 1e8;
const double pi=3.141592653589;
int vis[maxn], first[maxn], len = 0;//firrs一定要初始化为-1memest(first,-1,sizeof(first));
int a[maxn];
int dis[maxn];
int n, m , w;
struct node
{
int to, next, val;//t代表时间,c代表承重
}e[maxm << 3];
void add(int u, int v, int w)
{
e[len].to = v;
e[len].next = first[u];
e[len].val = w;
first[u] = len++;
}
bool spfa(int s)
{
queue<int>q;
for(int i=1;i<=n;i++)
{
dis[i]=inf;
vis[i]=0;
}
q.push(s);
dis[1]=0;
while(!q.empty())
{
int u=q.front();
q.pop();
if(++vis[u]>=n)return 1;
for(int i=first[u];~i;i=e[i].next)
{
int v=e[i].to;
if(dis[v]>dis[u]+e[i].val)
{
dis[v]=dis[u]+e[i].val;
q.push(v);
}
}
}
return 0;
}
int main()
{
int T;
scanf("%d",&T);
while(T--)
{
ms(first,-1);
len=0;
scanf("%d%d%d",&n,&m,&w);
for(int i=1; i<=m; i++)
{
int u,v,x;
scanf("%d%d%d",&u,&v,&x);
add(u,v,x);
add(v,u,x);
}
for(int i=1;i<=w;i++)
{
int u,v,x;
scanf("%d%d%d",&u,&v,&x);
add(u,v,-x);
}
if(spfa(1))
{
printf("YES\n");
}
else
{
printf("NO\n");
}
}
return 0;
}
- MPI Maelstrom
读题半小时,写代码五分钟,读完题目发现就是求1到到其他点的最短路中的最大值
#include<iostream>
#include<stdio.h>
#include<math.h>
#include<string.h>
#include<string>
#include<vector>
#include<queue>
#include<algorithm>
#include<deque>
#include<map>
#include<stdlib.h>
#include<set>
#include<iomanip>
#include<stack>
#define ll long long
#define ms(a,b) memset(a,b,sizeof(a))
#define lowbit(x) x & -x
#define fi first
#define se second
#define bug cout<<"----acac----"<<endl
#define IOS ios::sync_with_stdio(false), cin.tie(0),cout.tie(0)
using namespace std;
const int maxn = 2e6 + 50;
const int maxm = 1.5e5+50;
const double eps = 1e-7;
const int inf = 0x3f3f3f3f;
const ll lnf = 0x3f3f3f3f3f3f3f3f;
const int mod = 1e8;
const double pi=3.141592653589;
int a[105][105],dis[105],vis[105],n;
struct node
{
int id,val;
node(int id,int val)
{
this->id=id;
this->val=val;
}
bool operator<(const node &x)const
{
return val>x.val;
}
};
void dij(int s)
{
ms(vis,0);
for(int i=0;i<=n;i++)
{
dis[i]=inf;
}
dis[s]=0;
priority_queue<node>q;
q.push(node(s,0));
while(!q.empty())
{
int u=q.top().id;
q.pop();
if(vis[u])continue;
vis[u]=1;
for(int i=1;i<=n;i++)
{
if(dis[i]>dis[u]+a[u][i])
{
dis[i]=dis[u]+a[u][i];
q.push(node(i,dis[i]));
}
}
}
}
int get(char x[])
{
int ans=0;
int len=strlen(x);
for(int i=0;i<len;i++)
{
ans=(ans*10+x[i]-'0');
}
return ans;
}
int main()
{
// int n;
scanf("%d",&n);
char ch[10];
for(int i=1;i<=n;i++)
{
for(int j=1;j<i;j++)
{
scanf("%s",ch);
if(ch[0]!='x')
a[i][j]=a[j][i]=get(ch);
else
a[i][j]=a[j][i]=inf;
}
}
dij(1);
int ans=-inf;
for(int i=2;i<=n;i++)
{
ans=max(ans,dis[i]);
}
printf("%d\n",ans);
return 0;
}
- Cow Contest
这题的意思就是求能确定关系的个数,也就是其他点和这个点是否存在路径
暴力跑一下floyd就好了
#include<iostream>
#include<stdio.h>
#include<math.h>
#include<string.h>
#include<string>
#include<vector>
#include<queue>
#include<algorithm>
#include<deque>
#include<map>
#include<stdlib.h>
#include<set>
#include<iomanip>
#include<stack>
#define ll long long
#define ms(a,b) memset(a,b,sizeof(a))
#define lowbit(x) x & -x
#define fi first
#define se second
#define bug cout<<"----acac----"<<endl
#define IOS ios::sync_with_stdio(false), cin.tie(0),cout.tie(0)
using namespace std;
const int maxn = 2e5 + 50;
const int maxm = 1.5e5+50;
const double eps = 1e-7;
const int inf = 0x3f3f3f3f;
const ll lnf = 0x3f3f3f3f3f3f3f3f;
const int mod = 1e8;
const double pi=3.141592653589;
int n,m;
int dis[105][105];
void floyd()
{
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]);
}
}
}
}
int main()
{
scanf("%d%d",&n,&m);
for (int i = 1; i <=n; i++)
{
for (int j = 1; j <= n; j++)
{
dis[i][j] = i == j ? 0 : inf;
}
}
for(int i=1; i<=m; i++)
{
int u,v;
scanf("%d%d",&u,&v);
dis[u][v]=1;
}
int ans=0;
floyd();
for(int i=1; i<=n; i++)
{
bool flage=true;
for(int j=1; j<=n; j++)
{
if(dis[i][j]==inf&&dis[j][i]==inf)
{
flage=false;
}
}
if(flage)
{
ans++;
}
}
printf("%d\n",ans);
return 0;
}
- Arbitrage
和前面那个题差不多
#include<iostream>
#include<stdio.h>
#include<math.h>
#include<string.h>
#include<string>
#include<vector>
#include<queue>
#include<algorithm>
#include<deque>
#include<map>
#include<stdlib.h>
#include<set>
#include<iomanip>
#include<stack>
#define ll long long
#define ms(a,b) memset(a,b,sizeof(a))
#define lowbit(x) x & -x
#define fi first
#define se second
#define bug cout<<"----acac----"<<endl
#define IOS ios::sync_with_stdio(false), cin.tie(0),cout.tie(0)
using namespace std;
const int maxn = 2e6 + 50;
const int maxm = 1.5e5+50;
const double eps = 1e-7;
const int inf = 0x3f3f3f3f;
const ll lnf = 0x3f3f3f3f3f3f3f3f;
const int mod = 1e8;
const double pi=3.141592653589;
map<string,int>mp;
int cnt,n,m;
double a[35][35];
double dis[35];
bool spfa(int s)
{
queue<int>q;
q.push(s);
for(int i=1;i<=n;i++)
{
dis[i]=0;
}
dis[s]=100;
while(!q.empty())
{
int u=q.front();
q.pop();
for(int i=1;i<=n;i++)
{
if(dis[i]<dis[u]*a[u][i])
{
dis[i]=dis[u]*a[u][i];
if(dis[s]>100)
{
return 1;
}
q.push(i);
}
}
}
return 0;
}
int main()
{
IOS;
int cas=1;
while(cin>>n)
{
if(n==0)
{
break;
}
mp.clear();
ms(a,0);
cnt=0;
string s,s2;
for(int i=1;i<=n;i++)
{
cin>>s;
mp[s]=++cnt;
}
cin>>m;
double x;
for(int i=1;i<=m;i++)
{
cin>>s>>x>>s2;
a[mp[s]][mp[s2]]=x;
}
if(spfa(1))
{
cout<<"Case "<<cas++<<": Yes"<<endl;
}
else
{
cout<<"Case "<<cas++<<": No"<<endl;
}
}
return 0;
}
正反建图然后把所有的dis【i】加起来
#include<iostream>
#include<stdio.h>
#include<math.h>
#include<string.h>
#include<string>
#include<vector>
#include<queue>
#include<algorithm>
#include<deque>
#include<map>
#include<stdlib.h>
#include<set>
#include<iomanip>
#include<stack>
#define ll long long
#define ms(a,b) memset(a,b,sizeof(a))
#define lowbit(x) x & -x
#define fi first
#define se second
#define bug cout<<"----acac----"<<endl
#define IOS ios::sync_with_stdio(false), cin.tie(0),cout.tie(0)
using namespace std;
const int maxn = 1e6 + 50;
const int maxm = 1.5e5+50;
const double eps = 1e-7;
const int inf = 0x3f3f3f3f;
const ll lnf = 0x3f3f3f3f3f3f3f3f;
const int mod = 1e8;
const double pi=3.141592653589;
int first1[maxn],cnt1,cnt2,first2[maxn],n,vis[maxn];
int m;
ll dis[maxn];
struct node
{
int to,next,val;
}g1[maxn],g2[maxn];
void add(int u,int v,int w)
{
g1[++cnt1].to=v;
g1[cnt1].next=first1[u];
g1[cnt1].val=w;
first1[u]=cnt1;
g2[++cnt2].to=u;
g2[cnt2].next=first2[v];
g2[cnt2].val=w;
first2[v]=cnt2;
}
struct point
{
int id,val;
point(int id,int val)
{
this->id=id;
this->val=val;
}
bool operator<(const point&x)const
{
return val>x.val;
}
};
void dij(int s)
{
for(int i=0;i<=n;i++)
{
vis[i]=0;
dis[i]=inf;
}
priority_queue<point>q;
dis[s]=0;
q.push({s,0});
while(!q.empty())
{
int u=q.top().id;
q.pop();
if(vis[u])continue;
vis[u]=1;
for(int i=first1[u];~i;i=g1[i].next)
{
int v=g1[i].to;
if(dis[v]>dis[u]+g1[i].val&&!vis[v])
{
dis[v]=dis[u]+g1[i].val;
q.push(point(g1[i].to,dis[v]));
}
}
}
}
void dij2(int s)
{
for(int i=0;i<=n;i++)
{
vis[i]=0;
dis[i]=inf;
}
priority_queue<point>q;
dis[s]=0;
q.push({s,0});
while(!q.empty())
{
int u=q.top().id;
q.pop();
if(vis[u])continue;
vis[u]=1;
for(int i=first2[u];~i;i=g2[i].next)
{
int v=g2[i].to;
if(dis[v]>dis[u]+g2[i].val&&!vis[v])
{
dis[v]=dis[u]+g2[i].val;
q.push(point(g2[i].to,dis[v]));
}
}
}
}
int main()
{
int T;
scanf("%d",&T);
while(T--)
{
scanf("%d%d",&n,&m);
for(int i=1;i<=n;i++)
{
first1[i]=-1;
first2[i]=-1;
}
cnt1=0;
cnt2=0;
for(int i=1;i<=m;i++)
{
int u,v,w;
scanf("%d%d%d",&u,&v,&w);
add(u,v,w);
}
ll ans=0;
dij(1);
for(int i=2;i<=n;i++)
{
ans+=dis[i];
}
dij2(1);
for(int i=2;i<=n;i++)
{
ans+=dis[i];
}
printf("%lld\n",ans);
}
return 0;
}
看懂题目后也是水题,板子题
#include<iostream>
#include<stdio.h>
#include<math.h>
#include<string.h>
#include<string>
#include<vector>
#include<queue>
#include<algorithm>
#include<deque>
#include<map>
#include<stdlib.h>
#include<set>
#include<iomanip>
#include<stack>
#define ll long long
#define ms(a,b) memset(a,b,sizeof(a))
#define lowbit(x) x & -x
#define fi first
#define se second
#define bug cout<<"----acac----"<<endl
#define IOS ios::sync_with_stdio(false), cin.tie(0),cout.tie(0)
using namespace std;
const int maxn = 3e5 + 50;
const int maxm = 1.5e5+50;
const double eps = 1e-7;
const int inf = 0x3f3f3f3f;
const ll lnf = 0x3f3f3f3f3f3f3f3f;
const int mod = 1e8;
const double pi=3.141592653589;
int n,m;
int head[maxn],dis[maxn],len,vis[maxn];
struct node
{
int to,next,val;
}e[maxn<<1];
struct point
{
int id,val;
point(int id,int val)
{
this->id=id;
this->val=val;
}
bool operator<(const point& x)const
{
return val > x.val;
}
};
void add(int u,int v,int w)
{
e[len].to=v;
e[len].next=head[u];
e[len].val=w;
head[u]=len++;
}
void dij(int s)
{
for(int i=1;i<=n;i++)
{
dis[i]=inf;
vis[i]=0;
}
priority_queue<point>q;
dis[s]=0;
q.push(point(s,0));
while(!q.empty())
{
int u=q.top().id;
q.pop();
if(vis[u])continue;
vis[u]=1;
for(int i=head[u];~i;i=e[i].next)
{
int v=e[i].to;
if(dis[v]>dis[u]+e[i].val&&!vis[v])
{
dis[v]=dis[u]+e[i].val;
q.push(point(v,dis[v]));
}
}
}
}
int main()
{
while(~scanf("%d%d",&n,&m))
{
ms(head,-1);
len=0;
for(int i=1;i<=m;i++)
{
int u,v,w;
scanf("%d%d%d",&u,&v,&w);
add(u,v,w);
}
dij(1);
printf("%d\n",dis[n]);
}
return 0;
}
疯狂建边
#include<iostream>
#include<stdio.h>
#include<math.h>
#include<string.h>
#include<string>
#include<vector>
#include<queue>
#include<algorithm>
#include<deque>
#include<map>
#include<stdlib.h>
#include<set>
#include<iomanip>
#include<stack>
#define ll long long
#define ms(a,b) memset(a,b,sizeof(a))
#define lowbit(x) x & -x
#define fi first
#define se second
#define bug cout<<"----acac----"<<endl
#define IOS ios::sync_with_stdio(false), cin.tie(0),cout.tie(0)
using namespace std;
const int maxn = 5e5 + 50;
const int maxm = 1.5e5+50;
const double eps = 1e-7;
const int inf = 0x3f3f3f3f;
const ll lnf = 0x3f3f3f3f3f3f3f3f;
const int mod = 1e8;
const double pi=3.141592653589;
int subx[205],suby[205];
double mp[205][205];
int cnt=2,temp=2,vis[205];
double dis[205];
struct point
{
int id;
double val;
point(int id,double val)
{
this->id=id;
this->val=val;
}
bool operator<(const point & x)const
{
return val>x.val;
}
};
void dij(int s)
{
for(int i=0;i<=cnt;i++)
{
dis[i]=(double)inf;
vis[i]=0;
}
dis[s]=0;
priority_queue<point>q;
q.push(point(s,0.0));
while(!q.empty())
{
int u=q.top().id;
q.pop();
if(vis[u])continue;
vis[u]=1;
for(int i=0;i<cnt;i++)
{
if(dis[i]>dis[u]+mp[u][i])
{
dis[i]=dis[u]+mp[u][i];
q.push(point(i,dis[i]));
}
}
}
}
int sove(int x1,int x2,int y1,int y2)
{
return (x1-x2)*(x1-x2)+(y1-y2)*(y1-y2);
}
int main()
{
scanf("%d%d%d%d",&subx[0],&suby[0],&subx[1],&suby[1]);
int x,y;
while(scanf("%d%d",&x,&y)!=EOF)
{
if(x==-1&&y==-1)
{
for(int i=cnt;i<temp-1;i++)
{
mp[i][i+1]=mp[i+1][i]=sqrt(1.0*sove(subx[i],subx[i+1],suby[i],suby[i+1]))*3.0/2000.0;
}
cnt=temp;
continue;
}
subx[temp]=x;
suby[temp++]=y;
}
// bug;
for(int i=0;i<cnt;i++)
{
for(int j=i+1;j<cnt;j++)
{
if(mp[i][j]==0)
mp[i][j]=mp[j][i]=sqrt(1.0*sove(subx[i],subx[j],suby[i],suby[j]))*3.0/500;
}
}
dij(0);
printf("%d\n",(int)(dis[1]+0.5));
return 0;
}