NOIP2013Day1T3 表示只能过一个点

•A 国有 n 座城市,编号从 1 到 n,城市之间有 m 条双向道路。每一条道路对车辆都有重量限制,简称限重。现在有 q 辆货车在运输货物,司机们想知道每辆车在不超过车辆限重的情况下,最多能运多重的货物。

  1 #include<iostream>
  2 #include<cstdio>
  3 #include<cstring>
  4 #include<cmath>
  5 #include<algorithm>
  6 using namespace std;
  7 struct node
  8 {
  9     int u;
 10     int v;
 11     int w;
 12 }edge[1001];
 13 int num=1;
 14 int maxn[101][101];
 15 int f[1001];
 16 int x,y;
 17 int ans=0x7fffffff;
 18 int cmp(const node &a,const node &b)
 19 {
 20     return a.w>b.w;
 21 }
 22 int find(int x)
 23 {
 24     if(x!=f[x])
 25     f[x]=find(f[x]);
 26     return f[x];
 27 }
 28 void unionn(int x,int y)
 29 {
 30     int fx=find(x);
 31     int fy=find(y);
 32     f[fx]=fy;
 33 }
 34 int vis[10001];
 35 int n,m;
 36 int flag=0;
 37 int dfs(int p)
 38 {
 39     if(p==y)
 40     flag=1;
 41     else
 42     {
 43         for(int i=1;i<=n;i++)
 44         {
 45             if(vis[i]==0&&maxn[p][i]!=0x7fffffff)
 46             {
 47                 vis[i]=1;
 48                 ans=min(ans,maxn[p][i]);
 49                 dfs(i);
 50                 vis[i]=0;
 51                 ans=min(ans,maxn[p][i]);
 52             }
 53
 54         }
 55     }
 56     //printf("%d",ans);
 57 }
 58 int main()
 59 {
 60
 61     scanf("%d%d",&n,&m);
 62     for(int i=1;i<=n;i++)f[i]=i;
 63     for(int i=1;i<=m;i++)
 64     {
 65         scanf("%d%d%d",&edge[num].u,&edge[num].v,&edge[num].w);
 66         num++;
 67     }
 68     sort(edge+1,edge+num,cmp);
 69     int k=0;
 70     for(int i=1;i<=num;i++)
 71     {
 72         if(find(edge[i].u)!=find(edge[i].v))
 73         {
 74             unionn(edge[i].u,edge[i].v);
 75             //maxn[edge[i].v]=max(edge[i].w,maxn[edge[i].v]);
 76             //maxn[edge[i].u]=max(edge[i].w,maxn[edge[i].u]);
 77             maxn[edge[i].u][edge[i].v]=max(maxn[edge[i].u][edge[i].v],edge[i].w);
 78             maxn[edge[i].v][edge[i].u]=max(maxn[edge[i].u][edge[i].v],edge[i].w);
 79             k++;
 80         }
 81         if(k==n-1)break;
 82     }
 83     for(int i=1;i<=n;i++)
 84     for(int j=1;j<=n;j++)
 85     {
 86         if(maxn[i][j]==0)
 87         maxn[i][j]=0x7fffffff;
 88     }
 89     /*for(int k=1;k<=n;k++)
 90     {
 91         for(int i=1;i<=n;i++)
 92         {
 93             for(int j=1;j<=n;j++)
 94             {
 95                 if(maxn[i][k]!=0x7fffffff&&maxn[k][j]!=0x7fffffff)
 96                 if(maxn[i][j]>maxn[i][k]+maxn[k][j])
 97                 maxn[i][j]=maxn[i][k]+maxn[k][j];
 98             }
 99         }
100     }*/
101     int q;
102     scanf("%d",&q);
103     for(int i=1;i<=q;i++)
104     {
105         flag=0;
106         memset(vis,0,sizeof(vis));
107         ans=0x7fffffff;
108         scanf("%d%d",&x,&y);
109         dfs(x);
110         //printf("*******************************\n");
111         if(ans!=0x7fffffff&&flag==1)
112         printf("%d\n",ans);
113         else
114         printf("-1\n");
115         //printf("*******************************\n");
116         /*if(maxn[x][y]==0)
117         printf("-1\n");
118         else
119         printf("%d\n",maxn[x][y]);*/
120         /*for(int j=x;j<=y;j++)
121         {
122             if(maxn[j]<maxnnow&&maxn[j]!=0)
123             maxnnow=maxn[j];
124         }
125         if(maxnnow==0x7ffff)printf("-1\n");
126         else printf("%d\n",maxnnow);*/
127     }
128     return 0;
129 }
  1 #include<iostream>
  2 #include<cstdio>
  3 #include<cstring>
  4 #include<cmath>
  5 #include<algorithm>
  6 using namespace std;
  7 struct node
  8 {
  9     int u;
 10     int v;
 11     int w;
 12 }edge[1001];
 13 int num=1;
 14 int maxn[101][101];
 15 int f[1001];
 16 int x,y;
 17 int ans=0x7fffffff;
 18 int cmp(const node &a,const node &b)
 19 {
 20     return a.w>b.w;
 21 }
 22 int find(int x)
 23 {
 24     if(x!=f[x])
 25     f[x]=find(f[x]);
 26     return f[x];
 27 }
 28 void unionn(int x,int y)
 29 {
 30     int fx=find(x);
 31     int fy=find(y);
 32     f[fx]=fy;
 33 }
 34 int vis[10001];
 35 int n,m;
 36 int flag=0;
 37 int dfs(int p)
 38 {
 39     if(p==y)
 40     flag=1;
 41     else
 42     {
 43         for(int i=1;i<=n;i++)
 44         {
 45             if(vis[i]==0&&maxn[p][i]!=0x7fffffff)
 46             {
 47                 vis[i]=1;
 48                 ans=min(ans,maxn[p][i]);
 49                 dfs(i);
 50                 vis[i]=0;
 51                 ans=min(ans,maxn[p][i]);
 52             }
 53
 54         }
 55     }
 56     //printf("%d",ans);
 57 }
 58 int main()
 59 {
 60
 61     scanf("%d%d",&n,&m);
 62     for(int i=1;i<=n;i++)f[i]=i;
 63     for(int i=1;i<=m;i++)
 64     {
 65         scanf("%d%d%d",&edge[num].u,&edge[num].v,&edge[num].w);
 66         num++;
 67     }
 68     sort(edge+1,edge+num,cmp);
 69     int k=0;
 70     for(int i=1;i<=num;i++)
 71     {
 72         if(find(edge[i].u)!=find(edge[i].v))
 73         {
 74             unionn(edge[i].u,edge[i].v);
 75             //maxn[edge[i].v]=max(edge[i].w,maxn[edge[i].v]);
 76             //maxn[edge[i].u]=max(edge[i].w,maxn[edge[i].u]);
 77             maxn[edge[i].u][edge[i].v]=max(maxn[edge[i].u][edge[i].v],edge[i].w);
 78             maxn[edge[i].v][edge[i].u]=max(maxn[edge[i].u][edge[i].v],edge[i].w);
 79             k++;
 80         }
 81         if(k==n-1)break;
 82     }
 83     for(int i=1;i<=n;i++)
 84     for(int j=1;j<=n;j++)
 85     {
 86         if(maxn[i][j]==0)
 87         maxn[i][j]=0x7fffffff;
 88     }
 89     /*for(int k=1;k<=n;k++)
 90     {
 91         for(int i=1;i<=n;i++)
 92         {
 93             for(int j=1;j<=n;j++)
 94             {
 95                 if(maxn[i][k]!=0x7fffffff&&maxn[k][j]!=0x7fffffff)
 96                 if(maxn[i][j]>maxn[i][k]+maxn[k][j])
 97                 maxn[i][j]=maxn[i][k]+maxn[k][j];
 98             }
 99         }
100     }*/
101     int q;
102     scanf("%d",&q);
103     for(int i=1;i<=q;i++)
104     {
105         flag=0;
106         memset(vis,0,sizeof(vis));
107         ans=0x7fffffff;
108         scanf("%d%d",&x,&y);
109         dfs(x);
110         //printf("*******************************\n");
111         if(ans!=0x7fffffff&&flag==1)
112         printf("%d\n",ans);
113         else
114         printf("-1\n");
115         //printf("*******************************\n");
116         /*if(maxn[x][y]==0)
117         printf("-1\n");
118         else
119         printf("%d\n",maxn[x][y]);*/
120         /*for(int j=x;j<=y;j++)
121         {
122             if(maxn[j]<maxnnow&&maxn[j]!=0)
123             maxnnow=maxn[j];
124         }
125         if(maxnnow==0x7ffff)printf("-1\n");
126         else printf("%d\n",maxnnow);*/
127     }
128     return 0;
129 }
时间: 2024-10-29 19:07:52

NOIP2013Day1T3 表示只能过一个点的相关文章

解决微信OAuth2.0网页授权回调域名只能设置一个的问题

https://github.com/HADB/GetWeixinCode GetWeixinCode 使用方法 部署get-weixin-code.html至你的微信授权回调域名的目录下,例如http://wx.abc.com/get-weixin-code.html 在其他页面的使用方式如下,类似于直接通过微信回调的方式,只是将回调地址改成了get-weixin-code.html的地址,另外省 去了response_type参数(因为它只能为code)以及#wechat_redirect的

javascript中如何让两个radio同时只能选中一个

<html> <head> <title>测试</title> </head> <body leftmargin="0" topmargin="0"> <form> <input type="radio" name="sex1" value="male">Male <br> <input typ

继承的基本概念: (1)Java不支持多继承,也就是说子类至多只能有一个父类。 (2)子类继承了其父类中不是私有的成员变量和成员方法,作为自己的成员变量和方法。 (3)子类中定义的成员变量和父类中定义的成员变量相同时,则父类中的成员变量不能被继承。 (4)子类中定义的成员方法,并且这个方法的名字返回类型,以及参数个数和类型与父类的某个成员方法完全相同,则父类的成员方法不能被继承。 分析以上程

继承的基本概念: (1)Java不支持多继承,也就是说子类至多只能有一个父类. (2)子类继承了其父类中不是私有的成员变量和成员方法,作为自己的成员变量和方法.(3)子类中定义的成员变量和父类中定义的成员变量相同时,则父类中的成员变量不能被继承.(4)子类中定义的成员方法,并且这个方法的名字返回类型,以及参数个数和类型与父类的某个成员方法完全相同,则父类的成员方法不能被继承. 分析以上程序示例,主要疑惑点是“子类继承父类的成员变量,父类对象是否会实例化?私有成员变量是否会被继承?被继承的成员变量

原创观点:还在认为企业或个人只能申请一个小程序吗?

今天第一次体验了整个小程序注册流程,使用的是我自己的这个简单的教程(个人无appid如何进行申请开发者权限,简单操作步骤),教程虽然是我的,我自己却没有真的实践过,真是误人子弟,自己也不一定能知道:今天亲自测试了一下:首先走完邮箱验证: 验证完毕后,开始进入信息登录,这里,有一些关键信息,是本文观点的主要支撑: 请输入管理员的身份证号码,一个身份证号码只能注册5个小程序. 然后填写完毕后,到了第二个关键点: 为了验证你的身份,请用绑定了管理员本人银行卡的微信扫描二维码. 这个点,透露了两个信息,

小结在一个java源文件当中可以有多个类,但是为什么只能有一个public类呢?而当这个类被修饰为public的话,为什么源文件名必须要与类名相同呢?

Java编程思想中的一段话: 当编写一个java源代码文件时,此文件通常被称为编译单元(有时也被称为转译单元).每个编译单元都必须有一个后缀名.java,而在编译单元内则可以有一个public类,该类的名称必须与文件的名称相同(包括大小写,但不包括文件的后缀名.java).每个编译单元只能有一个public类,否则编译器就不会接受.如果在该编译单元之中还有额外的类的话,那么在包之外的世界是无法看见这些类的,这是因为它们不是public类,而且它们主要用来为主public类提供支持. 理解: 每编

每个操作间只能进行一个单项任务

此外,因做完一例基因检测要在多个操作间之间穿梭,为防止交叉感染,每个操作间只能进行一个单项任务,房间的设置遵循“单向循环”原则,即按照检测流程依次向纵深分布.由遗传导致的耳聋,目前没有有效的恢复听力的手段.但这并不等于不可预防,基因检测就是最为有效的一种手段.通过基因检测,父母在孕前就可了解到子女出现遗传性耳聋的几率,并在孕中对胎儿进行检测,看其是否存在遗传性耳聋. 昨天,南京医科大学神经病学研究所在南京明基医院正式挂牌,专家告诉记者,研究所成立后,将逐渐引进国外最先进的基因检测技术,今后对十多

一个函数只能返回一个值?笑话

函数的define:若有两个变量x和y,对于x的每一个值,y都有唯一确定的值与它对应,则y与x有函数关系.一般用表示.其中x叫做自变量,y叫做因变量. 唯一的值?对啊,C语言函数中也是只能return 一个的而已,虽然你能写多个return 到C语言的函数中,可是见到第一个return 后,后面的操作都是不执行的.读者可以试试!!那么,我们怎样从一个C语言函数中得到多个值呢?我们可以用些技术吧???对的,真的可以!!!①可以利用指针,指针里放着变量的地址,如果我们改变它的指向,不就可以改变它的值

创业的时候只能专心致志做好一件事。什么叫“一件事”?只能开发一个游戏,只能做一个产品

著作权归作者所有.商业转载请联系作者获得授权,非商业转载请注明出处.作者:王统伟链接:http://www.zhihu.com/question/19550531/answer/15183706来源:知乎 这是我在商界招商网看到天使投资人曾李青(原腾讯公司五位创始人之一)对早期创业公司的看法 ,觉得对你蛮有帮助的,你可以参考下!曾李青:早期创业公司九种死法第一,跨行业创业 比如原来做游戏的人要做电商,原来做互联网社区的要做游戏.现在的互联网环境下,这种跨行业创业失败概率都会比较高. 在演讲中,他

作为类的成员函数,重载运算符只能有一个参数

1 overload a operator of a class, you can only use one para., this pointer is automatically used. class Rational { public: //not correct since this ponit would be used automatically. //Rational operator+ (const Rational& lhs, const Rational& rhs);